Return-Path: Delivered-To: apmail-ibatis-user-java-archive@www.apache.org Received: (qmail 11383 invoked from network); 6 Aug 2008 13:58:14 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Aug 2008 13:58:14 -0000 Received: (qmail 74665 invoked by uid 500); 6 Aug 2008 13:58:10 -0000 Delivered-To: apmail-ibatis-user-java-archive@ibatis.apache.org Received: (qmail 74652 invoked by uid 500); 6 Aug 2008 13:58:10 -0000 Mailing-List: contact user-java-help@ibatis.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user-java@ibatis.apache.org Delivered-To: mailing list user-java@ibatis.apache.org Received: (qmail 74641 invoked by uid 99); 6 Aug 2008 13:58:10 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Aug 2008 06:58:10 -0700 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [129.41.63.60] (HELO out002.atlarge.net) (129.41.63.60) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Aug 2008 13:57:11 +0000 Received: from MAIL-14PS.atlarge.net ([10.100.50.113]) by out002.atlarge.net with Microsoft SMTPSVC(6.0.3790.1830); Wed, 6 Aug 2008 08:57:18 -0500 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01C8F7CC.56B3D2AE" Subject: RE: Thread starvation - pool / Throttle issue? Date: Wed, 6 Aug 2008 08:57:30 -0500 Message-ID: In-reply-to: <16178eb10808060652w4b6a549fp3445ed9928bf74bb@mail.gmail.com> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Thread starvation - pool / Throttle issue? Thread-Index: Acj3y6WJprC1vbcRSbikBWUXZ8BOXwAAEXBA References: <5fb0f140807230443g5b0f599dnb54a48a7df8294a5@mail.gmail.com> <48873417.7050201@cruzio.com> <5fb0f140807230656u5ccb78ak773e97023531ad1d@mail.gmail.com> <536e8800808060555x4b96ceco699ea3e738646e25@mail.gmail.com> <16178eb10808060652w4b6a549fp3445ed9928bf74bb@mail.gmail.com> From: "Brian Parkinson" To: X-OriginalArrivalTime: 06 Aug 2008 13:57:18.0004 (UTC) FILETIME=[56B34F40:01C8F7CC] X-Virus-Checked: Checked by ClamAV on apache.org This is a multi-part message in MIME format. ------_=_NextPart_001_01C8F7CC.56B3D2AE Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable HI Clinton: =20 Have upgraded, and am refactoring some of my iBATIS code. You write: =20 "Pools handle closing connections, but you still have to call .close (or some higher level delegating method) to return the connection to the pool. The rules are always the same... if you open it / start it / retrieve it, then you must close it / stop it / return it... " =20 Below is an example Dao method implementation - my understanding (wrong, it would appear) is that the SqlMapClientDaoSupport takes care of ope/start/retrieve and close/stop/return.=20 =20 Do I need to enclose my call to getSqlMapClientTemplate().update(...) in a try/catch with open/close? =20 Thanks again - looks like homing in on the issue. Cheers, =20 parki... =20 --- x8 snip =20 public class AlertDao extends SqlMapClientDaoSupport implements IAlertDao { public Acknowledgement acknowledgeAlert(String thermostatIdentifier, String acknowledgeRef, boolean remindMeLater) throws Exception { AlertEntry alertEntry =3D new AlertEntry(thermostatIdentifier, acknowledgeRef); =20 getSqlMapClientTemplate().update("AlertMessage.updateByAlertEntry", alertEntry); =20 Acknowledgement acknowledgedSet =3D new Acknowledgement(); acknowledgedSet.setThermostatIdentifier(thermostatIdentifier); acknowledgedSet.setAcknowledgeRef(acknowledgeRef); acknowledgedSet.setRemindMeLater(remindMeLater); =20 return acknowledgedSet; } =20 ________________________________ From: Clinton Begin [mailto:clinton.begin@gmail.com]=20 Sent: Wednesday, August 06, 2008 9:52 AM To: user-java@ibatis.apache.org Subject: Re: Thread starvation - pool / Throttle issue? Pools handle closing connections, but you still have to call .close (or some higher level delegating method) to return the connection to the pool. The rules are always the same... if you open it / start it / retrieve it, then you must close it / stop it / return it...=20 That said, upgrade to 2.3.3. Then you'll more easily find the true root cause of your issue, as all of the Throttles have been removed for this very reason. You'll likely get a complaint about no more connections, or a DB deadlock. Clinton On Wed, Aug 6, 2008 at 7:18 AM, Brian Parkinson wrote: HI Nicholoz - looked at that thread - thx. =20 A key issue seems to be not closing connections, but my understanding is that the DBCP connection pool handles all that for me (?). =20 The Dao implementation is pretty simple - I'm not explicitly declaring transations, since using Spring transaction stuff and so each Dao method looks like below. =20 Should I be explicitly handling transations stuff, and placing everything inside try/catch/finally blocks? My understaniding was that the Spring SqlMapClientDaoSupport did that for me. =09 =09 public class AlertDao extends SqlMapClientDaoSupport implements IAlertDao { public Acknowledgement acknowledgeAlert(String thermostatIdentifier, String acknowledgeRef, boolean remindMeLater) throws Exception { AlertEntry alertEntry =3D new AlertEntry(thermostatIdentifier, acknowledgeRef); =20 =09 getSqlMapClientTemplate().update("AlertMessage.updateByAlertEntry", alertEntry); =20 Acknowledgement acknowledgedSet =3D new Acknowledgement(); acknowledgedSet.setThermostatIdentifier(thermostatIdentifier); acknowledgedSet.setAcknowledgeRef(acknowledgeRef); acknowledgedSet.setRemindMeLater(remindMeLater); =20 return acknowledgedSet; } ... ETC ... } =09 =09 The Spring declaration: =20 =20 =09 =20 =20 =20 Appreciated - regards - =20 parki... =20 ________________________________ From: Nicholoz Koka Kiknadze [mailto:kiknadze@gmail.com]=20 Sent: Wednesday, August 06, 2008 8:56 AM To: user-java@ibatis.apache.org Subject: Re: Thread starvation - pool / Throttle issue? =09 =09 Have a look at this thread: =09 =09 http://www.mail-archive.com/user-java@ibatis.apache.org/msg11828.html =09 Good luck =09 =09 On Wed, Aug 6, 2008 at 4:47 PM, Brian Parkinson wrote: =09 Hello: =09 So, I have things up and running under Java and iBATIS, but running into some starvation issue, and my server is locking up. When I dump threads, I see a bunch that are waiting for the connnection pool (see output #1 below) and as well, a bunch that are waiting on Throttle.increment (see output #2). =09 Has anyone see anything similar? =09 I am stumped right now - looking for ANY hints to help me track down (and fix :) what is going on - I don't know databases all that well, so help appreciated greatly. First up, I'm going to upgrade to latest version of iBATIS, but thinking I might have something wrong in my thread pool setup. =09 The pool setup: =09 =09 =09 com/ecobee/foundation/dao/ibatis/SqlMapConfig.xml =09 =09 =09 I currently have no element in my SqlMapConfig.xml file, so running with those defaults. =09 Any help is greatly appreciated - I am mystified. =09 I am using iBATIS 2.3.0.667 and commons dbcp 1.2.2, and running MySQL 5.0.32. =09 Off to upgrade to latest iBATIS as a start - =09 Cheers, =09 parki... =09 --- x8 snip =09 Output #1: =09 Thread: Thread[pool-1-thread-121,5,main]=3D -- java.lang.Object.wait(Native Method) -- java.lang.Object.wait(Object.java:474) -- =09 org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjec tPool.java:810) -- =09 org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSourc e.java:96) -- =09 org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.ja va:880) -- =09 org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin (DataSourceTransactionManager.java:200) -- =09 org.springframework.transaction.support.AbstractPlatformTransactionManag =09 er.getTransaction(AbstractPlatformTransactionManager.java:377) -- =09 org.springframework.transaction.interceptor.TransactionAspectSupport.cre =09 ateTransactionIfNecessary(TransactionAspectSupport.java:261) -- =09 org.springframework.transaction.interceptor.TransactionInterceptor.invok e(TransactionInterceptor.java:101) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref lectiveMethodInvocation.java:171) -- =09 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(E xposeInvocationInterceptor.java:89) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref lectiveMethodInvocation.java:171) -- =09 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo pProxy.java:204) -- $Proxy2.saveLogSet(Unknown Source) -- =09 com.ecobee.communicator.rest.restlet.LogRestlet.doPost(LogRestlet.java:7 6) -- =09 com.ecobee.communicator.rest.RestletManager.handleRequest(RestletManager .java:195) -- =09 com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest .java:112) -- sun.reflect.GeneratedMethodAccessor338.invoke(Unknown Source) -- =09 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) -- java.lang.reflect.Method.invoke(Method.java:585) -- =09 com.whatevernot.engine.standard.StateRunnable.run(StateRunnable.java:56) -- =09 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto r.java:650) -- =09 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja va:675) -- java.lang.Thread.run(Thread.java:595) =09 Output #2: =09 Thread: Thread[pool-1-thread-613,5,main]=3D -- java.lang.Object.wait(Native Method) -- java.lang.Object.wait(Object.java:474) -- com.ibatis.common.util.Throttle.increment(Throttle.java:70) -- com.ibatis.common.util.ThrottledPool.pop(ThrottledPool.java:57) -- =09 com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.popSession(SqlMapEx ecutorDelegate.java:933) -- =09 com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.(SqlMapSessionImpl .java:51) -- =09 com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.getLocalSqlMapSession(Sql MapClientImpl.java:259) -- =09 com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.startBatch(SqlMapClientIm pl.java:161) -- com.ecobee.foundation.dao.ibatis.LogDao.saveLogSet(LogDao.java:22) -- sun.reflect.GeneratedMethodAccessor341.invoke(Unknown Source) -- =09 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) -- java.lang.reflect.Method.invoke(Method.java:585) -- =09 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection( AopUtils.java:301) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinp oint(ReflectiveMethodInvocation.java:182) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref lectiveMethodInvocation.java:149) -- =09 org.springframework.transaction.interceptor.TransactionInterceptor.invok e(TransactionInterceptor.java:106) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref lectiveMethodInvocation.java:171) -- =09 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(E xposeInvocationInterceptor.java:89) -- =09 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref lectiveMethodInvocation.java:171) -- =09 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo pProxy.java:204) -- $Proxy2.saveLogSet(Unknown Source) -- =09 com.ecobee.communicator.rest.restlet.LogRestlet.doPost(LogRestlet.java:7 6) -- =09 com.ecobee.communicator.rest.RestletManager.handleRequest(RestletManager .java:195) -- =09 com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest .java:112) -- sun.reflect.GeneratedMethodAccessor338.invoke(Unknown Source) -- =09 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:25) -- java.lang.reflect.Method.invoke(Method.java:585) -- =09 com.whatevernot.engine.standard.StateRunnable.run(StateRunnable.java:56) -- =09 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto r.java:650) -- =09 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja va:675) -- java.lang.Thread.run(Thread.java:595) =09 ------_=_NextPart_001_01C8F7CC.56B3D2AE Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable
HI Clinton:
 
Have upgraded, and am refactoring some of my = iBATIS code.=20 You write:
 
"Pools handle closing connections, but you still have to call = .close (or=20 some higher level delegating method) to return the connection to the = pool. =20 The rules are always the same... if you open it / start it / retrieve = it, then=20 you must close it / stop it / return it... "
 
Below is an example Dao method implementation = - my=20 understanding (wrong, it would appear) is that the = SqlMapClientDaoSupport takes=20 care of ope/start/retrieve and close/stop/return.=20
 
Do I need to enclose my call to=20 getSqlMapClientTemplate().update(...) in a try/catch with=20 open/close?
 
Thanks again - looks like homing in on the=20 issue.

Cheers,
 
parki...
 
--- x8=20 snip
 
public class AlertDao extends = SqlMapClientDaoSupport=20 implements IAlertDao
{
 public Acknowledgement=20 acknowledgeAlert(String thermostatIdentifier, String=20 acknowledgeRef,
  boolean remindMeLater) throws=20 Exception
 {
  AlertEntry alertEntry =3D new=20 AlertEntry(thermostatIdentifier,=20 acknowledgeRef);
  
  getSqlMapClientTemplate()= .update("AlertMessage.updateByAlertEntry",=20 alertEntry);
 
  Acknowledgement acknowledgedSet = =3D new=20 Acknowledgement();
  acknowledgedSet.setThermostatIdentifier= (thermostatIdentifier);
  acknowledgedSet.setAcknowledgeRef(= acknowledgeRef);
  acknowledgedSet.setRemindMeLater(remindMe= Later);
  
  return=20 acknowledgedSet;
 }
 


From: Clinton Begin=20 [mailto:clinton.begin@gmail.com]
Sent: Wednesday, August 06, = 2008=20 9:52 AM
To: user-java@ibatis.apache.org
Subject: Re: = Thread=20 starvation - pool / Throttle issue?

Pools handle closing connections, but you still have to = call .close=20 (or some higher level delegating method) to return the connection to the = pool.  The rules are always the same... if you open it / start it / = retrieve it, then you must close it / stop it / return it... =

That said,=20 upgrade to 2.3.3.  Then you'll more = easily find=20 the true root cause of your issue, as all of the Throttles have been = removed for=20 this very reason.  You'll likely get a complaint about no more = connections,=20 or a DB deadlock.

Clinton

On Wed, Aug 6, 2008 at 7:18 AM, Brian Parkinson = <parki@avaning.com>=20 wrote:
HI Nicholoz  -=20 looked at that thread - thx.
 
A key=20 issue seems to be not closing connections, but my understanding is = that the=20 DBCP connection pool handles all that for me (?).
 
The Dao=20 implementation is pretty simple - I'm not explicitly declaring = transations,=20 since using Spring transaction stuff and so each Dao method looks like = below.
 
Should I=20 be explicitly handling transations stuff, and placing everything = inside=20 try/catch/finally blocks? My understaniding was that the Spring=20 SqlMapClientDaoSupport did that for me.

public class AlertDao extends=20 SqlMapClientDaoSupport implements IAlertDao
{
 public=20 Acknowledgement acknowledgeAlert(String thermostatIdentifier, String=20 acknowledgeRef,
  boolean remindMeLater) throws=20 Exception
 {
  AlertEntry alertEntry =3D new=20 AlertEntry(thermostatIdentifier,=20 = acknowledgeRef);
  
  getSqlMapClientTemplate()= .update("AlertMessage.updateByAlertEntry",=20 alertEntry);
 
  Acknowledgement acknowledgedSet = =3D new=20 = Acknowledgement();
  acknowledgedSet.setThermostatIdentifier= (thermostatIdentifier);
  acknowledgedSet.setAcknowledgeRef(= acknowledgeRef);
  acknowledgedSet.setRemindMeLater(remindMe= Later);
  
  return=20 acknowledgedSet;
 }
... ETC = ...
}
The Spring=20 declaration:
 
 <bean id=3D"txManager"=20 = class=3D"org.springframework.jdbc.datasource.DataSourceTransactionManager= ">

  <property name=3D"dataSource"=20 = ref=3D"dataSource"/>
 </bean>
 
 &= lt;tx:advice=20 id=3D"txAdvice"=20 = transaction-manager=3D"txManager">
  <tx:attributes>= ;
   <tx:method=20 name=3D"get*" read-only=3D"true" = />
   <tx:method name=3D"*"=20 = />
  </tx:attributes>
 </tx:advice> 
 <aop:config>
  <aop:pointcut=20 id=3D"daoServiceOperation" expression=3D"execution(*=20 com.ecobee.foundation.dao.ibatis.*.*(..))"=20 />
  <aop:advisor advice-ref=3D"txAdvice"=20 pointcut-ref=3D"daoServiceOperation"=20 />
 </aop:config>
 
Appreciated - regards -
 
parki...
 


From: Nicholoz Koka Kiknadze = [mailto:kiknadze@gmail.com]=20
Sent: Wednesday, August 06, 2008 8:56 AM
To: user-java@ibatis.apache.org
Subject: Re: = Thread=20 starvation - pool / Throttle issue?

Have a look at this thread:

http://www.mail-archive.com/user-java@ibatis.apache.org/m= sg11828.html

Good=20 luck

On Wed, Aug 6, 2008 at 4:47 PM, Brian = Parkinson <parki@avaning.com> wrote:
Hello:

So,=20 I have things up and running under Java and iBATIS, but running = into
some=20 starvation issue, and my server is locking up. When I dump = threads,
I see=20 a bunch that are waiting for the connnection pool (see output = #1
below)=20 and as well, a bunch that are waiting on Throttle.increment = (see
output=20 #2).

Has anyone see anything similar?

I am stumped = right now -=20 looking for ANY hints to help me track down
(and fix :) what is = going on=20 - I don't know databases all that well, so
help appreciated = greatly.=20 First up, I'm going to upgrade to latest
version of iBATIS, but = thinking=20 I might have something wrong in my
thread pool setup.

The = pool=20 setup:

       <bean=20 = id=3D"mapConfig"
class=3D"org.springframework.core.io.ClassPathResourc= e">
 =20            =20 =  <constructor-arg>

<value>com/ecobee/foundation/d= ao/ibatis/SqlMapConfig.xml</value>
 =20            =20  </constructor-arg>
     =20  </bean>

       <bean=20 = id=3D"dataSource"
class=3D"org.apache.commons.dbcp.BasicDataSource"=20 destroy-method=3D"close">
          =  =20    <property=20 name=3D"driverClassName"
value=3D"com.mysql.jdbc.Driver" = />
 =20              <property = name=3D"url"=20 value=3D"jdbc:mysql:///ecobee" />
        =  =20      <property name=3D"username" value=3D"XXX" = />
 =20              <property = name=3D"password"=20 value=3D"XXX" />
            =  =20  <property name=3D"initialSize" value=3D"10" />
  =  =20            <property = name=3D"maxActive"=20 value=3D"100" />
            =  =20  <property name=3D"maxIdle" value=3D"10" />
  =    =20  </bean>

       <bean=20 = id=3D"sqlMapClient"
class=3D"org.springframework.orm.ibatis.SqlMapClie= ntFactoryBean">
 =20              <property=20 name=3D"dataSource" ref=3D"dataSource" />
      =  =20        <property name=3D"configLocation"=20 ref=3D"mapConfig" />
      =  </bean>

I=20 currently have no <settings> element in my SqlMapConfig.xml = file,=20 so
running with those defaults.

Any help is greatly = appreciated -=20 I am mystified.

I am using iBATIS 2.3.0.667 and commons dbcp = 1.2.2,=20 and running MySQL
5.0.32.

Off to upgrade to latest iBATIS = as a start=20 -

Cheers,

parki...

--- x8 snip

Output=20 #1:

Thread: Thread[pool-1-thread-121,5,main]=3D
 --=20 java.lang.Object.wait(Native Method)
 --=20 = java.lang.Object.wait(Object.java:474)
 --
org.apache.commons.= pool.impl.GenericObjectPool.borrowObject(GenericObjec
tPool.java:810)<= BR> --
org.apache.commons.dbcp.PoolingDataSource.getConnection(Po= olingDataSourc
e.java:96)
 --
org.apache.commons.dbcp.Basic= DataSource.getConnection(BasicDataSource.ja
va:880)
 --
org= .springframework.jdbc.datasource.DataSourceTransactionManager.doBegin
= (DataSourceTransactionManager.java:200)
 --
org.springframewor= k.transaction.support.AbstractPlatformTransactionManag
er.getTransacti= on(AbstractPlatformTransactionManager.java:377)
 --
org.spring= framework.transaction.interceptor.TransactionAspectSupport.cre
ateTran= sactionIfNecessary(TransactionAspectSupport.java:261)
 --
org.= springframework.transaction.interceptor.TransactionInterceptor.invok
e= (TransactionInterceptor.java:101)
 --
org.springframework.aop.= framework.ReflectiveMethodInvocation.proceed(Ref
lectiveMethodInvocati= on.java:171)
 --
org.springframework.aop.interceptor.ExposeInv= ocationInterceptor.invoke(E
xposeInvocationInterceptor.java:89)
&nb= sp;--
org.springframework.aop.framework.ReflectiveMethodInvocation.pro= ceed(Ref
lectiveMethodInvocation.java:171)
 --
org.springfr= amework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo
pProxy.ja= va:204)
 --=20 $Proxy2.saveLogSet(Unknown=20 = Source)
 --
com.ecobee.communicator.rest.restlet.LogRestlet.do= Post(LogRestlet.java:7
6)
 --
com.ecobee.communicator.rest.= RestletManager.handleRequest(RestletManager
.java:195)
 --
= com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest<= BR>.java:112)
 --=20 sun.reflect.GeneratedMethodAccessor338.invoke(Unknown=20 = Source)
 --
sun.reflect.DelegatingMethodAccessorImpl.invoke(De= legatingMethodAccessor
Impl.java:25)
 --=20 = java.lang.reflect.Method.invoke(Method.java:585)
 --
com.whate= vernot.engine.standard.StateRunnable.run(StateRunnable.java:56)
 = --
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolEx= ecuto
r.java:650)
 --
java.util.concurrent.ThreadPoolExecut= or$Worker.run(ThreadPoolExecutor.ja
va:675)
 --=20 java.lang.Thread.run(Thread.java:595)

Output = #2:

Thread:=20 Thread[pool-1-thread-613,5,main]=3D
 -- = java.lang.Object.wait(Native=20 Method)
 -- = java.lang.Object.wait(Object.java:474)
 --=20 = com.ibatis.common.util.Throttle.increment(Throttle.java:70)
 --=20 = com.ibatis.common.util.ThrottledPool.pop(ThrottledPool.java:57)
 = --
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.popSession(Sql= MapEx
ecutorDelegate.java:933)
 --
com.ibatis.sqlmap.engine= .impl.SqlMapSessionImpl.<init>(SqlMapSessionImpl
.java:51)
&n= bsp;--
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.getLocalSqlMapSe= ssion(Sql
MapClientImpl.java:259)
 --
com.ibatis.sqlmap.eng= ine.impl.SqlMapClientImpl.startBatch(SqlMapClientIm
pl.java:161)
&n= bsp;--=20 = com.ecobee.foundation.dao.ibatis.LogDao.saveLogSet(LogDao.java:22)
&nb= sp;--=20 sun.reflect.GeneratedMethodAccessor341.invoke(Unknown=20 = Source)
 --
sun.reflect.DelegatingMethodAccessorImpl.invoke(De= legatingMethodAccessor
Impl.java:25)
 --=20 = java.lang.reflect.Method.invoke(Method.java:585)
 --
org.sprin= gframework.aop.support.AopUtils.invokeJoinpointUsingReflection(
AopUti= ls.java:301)
 --
org.springframework.aop.framework.ReflectiveM= ethodInvocation.invokeJoinp
oint(ReflectiveMethodInvocation.java:182)<= BR> --
org.springframework.aop.framework.ReflectiveMethodInvocati= on.proceed(Ref
lectiveMethodInvocation.java:149)
 --
org.sp= ringframework.transaction.interceptor.TransactionInterceptor.invok
e(T= ransactionInterceptor.java:106)
 --
org.springframework.aop.fr= amework.ReflectiveMethodInvocation.proceed(Ref
lectiveMethodInvocation= .java:171)
 --
org.springframework.aop.interceptor.ExposeInvoc= ationInterceptor.invoke(E
xposeInvocationInterceptor.java:89)
 = ;--
org.springframework.aop.framework.ReflectiveMethodInvocation.proce= ed(Ref
lectiveMethodInvocation.java:171)
 --
org.springfram= ework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo
pProxy.java= :204)
 -- $Proxy2.saveLogSet(Unknown=20 = Source)
 --
com.ecobee.communicator.rest.restlet.LogRestlet.do= Post(LogRestlet.java:7
6)
 --
com.ecobee.communicator.rest.= RestletManager.handleRequest(RestletManager
.java:195)
 --
= com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest<= BR>.java:112)
 --=20 sun.reflect.GeneratedMethodAccessor338.invoke(Unknown=20 = Source)
 --
sun.reflect.DelegatingMethodAccessorImpl.invoke(De= legatingMethodAccessor
Impl.java:25)
 --=20 = java.lang.reflect.Method.invoke(Method.java:585)
 --
com.whate= vernot.engine.standard.StateRunnable.run(StateRunnable.java:56)
 = --
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolEx= ecuto
r.java:650)
 --
java.util.concurrent.ThreadPoolExecut= or$Worker.run(ThreadPoolExecutor.ja
va:675)
 --=20 = java.lang.Thread.run(Thread.java:595)


------_=_NextPart_001_01C8F7CC.56B3D2AE--