ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Brian Parkinson" <pa...@avaning.com>
Subject RE: Thread starvation - pool / Throttle issue?
Date Fri, 08 Aug 2008 13:51:03 GMT
HI Clinton:
 
Looks like the issue has been resolved - been running the server for
some time now, and no starvation issues seen (knocks wood loudly). I
made 3 changes:
 
1. Refactored some code to remove a possible contention/deadlock issue.
2. Upgrade to iBatis 2.3.3.720.
 
Everything looks great - help from this forum is very much appreciated.
 
Regards,

Brian...
 

________________________________

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


Yes, those statements are technically correct.  I look forward to seeing
the results of the new test.

Cheers,
Clinton


On Wed, Aug 6, 2008 at 9:21 AM, Brian Parkinson <parki@avaning.com>
wrote:


	Hi Clinton - 
	 
	Just for clarification
	 
	1. Using Spring for transactions means that my Dao method
implementartion can be simple (as example below) without
try/catch/finally blocks.
	 
	2. Using DBCP for connection pooling means that I don't have to
explictly release and connection resources.
	 
	Please advise - I'm now working on the assumption that my
implementation is good, and that the timeout/deadlock issue is caused by
a real old-fashioned deadlock, as opposed to something I'm not
releasing...
	 
	Upgraded to iBATIS-2.3.3.720 and off to investigate further.
	 
	All help really appreciated - thanks.
	 
	parki...
	 

________________________________

	
	From: Clinton Begin [mailto:clinton.begin@gmail.com] 
	
	Sent: Wednesday, August 06, 2008 11:16 AM 

	To: user-java@ibatis.apache.org
	Subject: Re: Thread starvation - pool / Throttle issue?
	

	Ah, if you're using Spring, then yes, it will take care of
resource allocation.  But your statement was: "but my understanding is
that the DBCP connection pool handles all that for me (?)", which is not
the case.
	
	Clinton
	
	On Wed, Aug 6, 2008 at 7:57 AM, Brian Parkinson
<parki@avaning.com> wrote:
	>
	> HI Clinton:
	>  
	> Have upgraded, and am refactoring some of my iBATIS code. You
write:
	>  
	> "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... "
	>  
	> 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.
	>  
	> Do I need to enclose my call to
getSqlMapClientTemplate().update(...) in a try/catch with open/close?
	>  
	> Thanks again - looks like homing in on the issue.
	> Cheers,
	>  
	> parki...
	>  
	> --- x8 snip
	>  
	> public class AlertDao extends SqlMapClientDaoSupport
implements IAlertDao
	> {
	>  public Acknowledgement acknowledgeAlert(String
thermostatIdentifier, String acknowledgeRef,
	>   boolean remindMeLater) throws Exception
	>  {
	>   AlertEntry alertEntry = new AlertEntry(thermostatIdentifier,
acknowledgeRef);
	>   
	>
getSqlMapClientTemplate().update("AlertMessage.updateByAlertEntry",
alertEntry);
	>  
	>   Acknowledgement acknowledgedSet = new Acknowledgement();
	>
acknowledgedSet.setThermostatIdentifier(thermostatIdentifier);
	>   acknowledgedSet.setAcknowledgeRef(acknowledgeRef);
	>   acknowledgedSet.setRemindMeLater(remindMeLater);
	>   
	>   return acknowledgedSet;
	>  }
	>  
	> ________________________________
	> From: Clinton Begin [mailto:clinton.begin@gmail.com]
	> 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...
	>
	> 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
<parki@avaning.com> wrote:
	>>
	>> HI Nicholoz  - looked at that thread - thx.
	>>  
	>> A key issue seems to be not closing connections, but my
understanding is that the DBCP connection pool handles all that for me
(?).
	>>  
	>> 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.
	>>  
	>> 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.
	>> public class AlertDao extends SqlMapClientDaoSupport
implements IAlertDao
	>> {
	>>  public Acknowledgement acknowledgeAlert(String
thermostatIdentifier, String acknowledgeRef,
	>>   boolean remindMeLater) throws Exception
	>>  {
	>>   AlertEntry alertEntry = new
AlertEntry(thermostatIdentifier, acknowledgeRef);
	>>   
	>>
getSqlMapClientTemplate().update("AlertMessage.updateByAlertEntry",
alertEntry);
	>>  
	>>   Acknowledgement acknowledgedSet = new Acknowledgement();
	>>
acknowledgedSet.setThermostatIdentifier(thermostatIdentifier);
	>>   acknowledgedSet.setAcknowledgeRef(acknowledgeRef);
	>>   acknowledgedSet.setRemindMeLater(remindMeLater);
	>>   
	>>   return acknowledgedSet;
	>>  }
	>> ... ETC ...
	>> }
	>> The Spring declaration:
	>>  
	>>  <bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
	>>   <property name="dataSource" ref="dataSource"/>
	>>  </bean>
	>>  
	>>  <tx:advice id="txAdvice" transaction-manager="txManager">
	>>   <tx:attributes>
	>>    <tx:method name="get*" read-only="true" />
	>>    <tx:method name="*" />
	>>   </tx:attributes>
	>>  </tx:advice>
	>>  
	>>  <aop:config>
	>>   <aop:pointcut id="daoServiceOperation"
expression="execution(* com.ecobee.foundation.dao.ibatis.*.*(..))" />
	>>   <aop:advisor advice-ref="txAdvice"
pointcut-ref="daoServiceOperation" />
	>>  </aop:config>
	>>  
	>> Appreciated - regards -
	>>  
	>> parki...
	>>  
	>> ________________________________
	>> From: Nicholoz Koka Kiknadze [mailto:kiknadze@gmail.com]
	>> Sent: Wednesday, August 06, 2008 8:56 AM
	>> To: user-java@ibatis.apache.org
	>> Subject: Re: Thread starvation - pool / Throttle issue?
	>>
	>> Have a look at this thread:
	>>
	>>
http://www.mail-archive.com/user-java@ibatis.apache.org/msg11828.html
	>>
	>> Good luck
	>>
	>> On Wed, Aug 6, 2008 at 4:47 PM, Brian Parkinson
<parki@avaning.com> wrote:
	>>>
	>>> Hello:
	>>>
	>>> 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).
	>>>
	>>> Has anyone see anything similar?
	>>>
	>>> 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.
	>>>
	>>> The pool setup:
	>>>
	>>>        <bean id="mapConfig"
	>>> class="org.springframework.core.io.ClassPathResource">
	>>>                <constructor-arg>
	>>>
	>>>
<value>com/ecobee/foundation/dao/ibatis/SqlMapConfig.xml</value>
	>>>                </constructor-arg>
	>>>        </bean>
	>>>
	>>>        <bean id="dataSource"
	>>> class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
	>>>                <property name="driverClassName"
	>>> value="com.mysql.jdbc.Driver" />
	>>>                <property name="url"
value="jdbc:mysql:///ecobee" />
	>>>                <property name="username" value="XXX" />
	>>>                <property name="password" value="XXX" />
	>>>                <property name="initialSize" value="10" />
	>>>                <property name="maxActive" value="100" />
	>>>                <property name="maxIdle" value="10" />
	>>>        </bean>
	>>>
	>>>        <bean id="sqlMapClient"
	>>>
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
	>>>                <property name="dataSource" ref="dataSource"
/>
	>>>                <property name="configLocation"
ref="mapConfig" />
	>>>        </bean>
	>>>
	>>> I currently have no <settings> element in my
SqlMapConfig.xml file, so
	>>> running with those defaults.
	>>>
	>>> Any help is greatly appreciated - I am mystified.
	>>>
	>>> I am using iBATIS 2.3.0.667 and commons dbcp 1.2.2, and
running MySQL
	>>> 5.0.32.
	>>>
	>>> Off to upgrade to latest iBATIS as a start -
	>>>
	>>> Cheers,
	>>>
	>>> parki...
	>>>
	>>> --- x8 snip
	>>>
	>>> Output #1:
	>>>
	>>> Thread: Thread[pool-1-thread-121,5,main]=
	>>>  -- java.lang.Object.wait(Native Method)
	>>>  -- java.lang.Object.wait(Object.java:474)
	>>>  --
	>>>
org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjec
	>>> tPool.java:810)
	>>>  --
	>>>
org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSourc
	>>> e.java:96)
	>>>  --
	>>>
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.ja
	>>> va:880)
	>>>  --
	>>>
org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin
	>>> (DataSourceTransactionManager.java:200)
	>>>  --
	>>>
org.springframework.transaction.support.AbstractPlatformTransactionManag
	>>>
er.getTransaction(AbstractPlatformTransactionManager.java:377)
	>>>  --
	>>>
org.springframework.transaction.interceptor.TransactionAspectSupport.cre
	>>> ateTransactionIfNecessary(TransactionAspectSupport.java:261)
	>>>  --
	>>>
org.springframework.transaction.interceptor.TransactionInterceptor.invok
	>>> e(TransactionInterceptor.java:101)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref
	>>> lectiveMethodInvocation.java:171)
	>>>  --
	>>>
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(E
	>>> xposeInvocationInterceptor.java:89)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref
	>>> lectiveMethodInvocation.java:171)
	>>>  --
	>>>
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo
	>>> pProxy.java:204)
	>>>  -- $Proxy2.saveLogSet(Unknown Source)
	>>>  --
	>>>
com.ecobee.communicator.rest.restlet.LogRestlet.doPost(LogRestlet.java:7
	>>> 6)
	>>>  --
	>>>
com.ecobee.communicator.rest.RestletManager.handleRequest(RestletManager
	>>> .java:195)
	>>>  --
	>>>
com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest
	>>> .java:112)
	>>>  -- sun.reflect.GeneratedMethodAccessor338.invoke(Unknown
Source)
	>>>  --
	>>>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
	>>> Impl.java:25)
	>>>  -- java.lang.reflect.Method.invoke(Method.java:585)
	>>>  --
	>>>
com.whatevernot.engine.standard.StateRunnable.run(StateRunnable.java:56)
	>>>  --
	>>>
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto
	>>> r.java:650)
	>>>  --
	>>>
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja
	>>> va:675)
	>>>  -- java.lang.Thread.run(Thread.java:595)
	>>>
	>>> Output #2:
	>>>
	>>> Thread: Thread[pool-1-thread-613,5,main]=
	>>>  -- 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)
	>>>  --
	>>>
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.popSession(SqlMapEx
	>>> ecutorDelegate.java:933)
	>>>  --
	>>>
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.<init>(SqlMapSessionImpl
	>>> .java:51)
	>>>  --
	>>>
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.getLocalSqlMapSession(Sql
	>>> MapClientImpl.java:259)
	>>>  --
	>>>
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)
	>>>  --
	>>>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
	>>> Impl.java:25)
	>>>  -- java.lang.reflect.Method.invoke(Method.java:585)
	>>>  --
	>>>
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(
	>>> AopUtils.java:301)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinp
	>>> oint(ReflectiveMethodInvocation.java:182)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref
	>>> lectiveMethodInvocation.java:149)
	>>>  --
	>>>
org.springframework.transaction.interceptor.TransactionInterceptor.invok
	>>> e(TransactionInterceptor.java:106)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref
	>>> lectiveMethodInvocation.java:171)
	>>>  --
	>>>
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(E
	>>> xposeInvocationInterceptor.java:89)
	>>>  --
	>>>
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(Ref
	>>> lectiveMethodInvocation.java:171)
	>>>  --
	>>>
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAo
	>>> pProxy.java:204)
	>>>  -- $Proxy2.saveLogSet(Unknown Source)
	>>>  --
	>>>
com.ecobee.communicator.rest.restlet.LogRestlet.doPost(LogRestlet.java:7
	>>> 6)
	>>>  --
	>>>
com.ecobee.communicator.rest.RestletManager.handleRequest(RestletManager
	>>> .java:195)
	>>>  --
	>>>
com.ecobee.communicator.engine.EngineRequest.handleRequest(EngineRequest
	>>> .java:112)
	>>>  -- sun.reflect.GeneratedMethodAccessor338.invoke(Unknown
Source)
	>>>  --
	>>>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
	>>> Impl.java:25)
	>>>  -- java.lang.reflect.Method.invoke(Method.java:585)
	>>>  --
	>>>
com.whatevernot.engine.standard.StateRunnable.run(StateRunnable.java:56)
	>>>  --
	>>>
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto
	>>> r.java:650)
	>>>  --
	>>>
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja
	>>> va:675)
	>>>  -- java.lang.Thread.run(Thread.java:595)
	>>
	>
	
	



Mime
View raw message