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: Question: "Connection.close has already been closed"
Date Mon, 18 Aug 2008 22:04:25 GMT
Thanks for the pointers Clinton:
 
I'm not needing lazy loading I don't think, so am running with a pretty
minimal configuration - I've left the dataSource element empty.
 
As near as I can tell, the Spring dataSource settings for the dbcp pool
(eg. maxActive, maxIdle, etc) are picked up from spring.
 
I've got this up and running now - hopefully this will fix the
Connection.close() issue.
 
Thanks a bunch.

Regards,
 
Brian Parkinson
 
--- x8 snip
 
iBatis:
 
<sqlMapConfig>
 
 <transactionManager type="EXTERNAL">
  <dataSource type="DBCP">
  </dataSource>
 </transactionManager>
   
 <sqlMap resource="com/ecobee/foundation/dao/ibatis/SqlMapAlert.xml" />
  .. etc.
</sqlMapConfig>
 
Spring:
 
 <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="YYY" /> 
  <property name="initialSize" value="10" />
  <property name="maxActive" value="100" /> 
  <property name="maxIdle" value="16" />
  <property name="maxWait" value="2000" />
 </bean>
 
 <bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" ref="mapConfig" />
 </bean>
 
 
 
 
 
 

________________________________

From: Clinton Begin [mailto:clinton.begin@gmail.com] 
Sent: Monday, August 18, 2008 5:05 PM
To: user-java@ibatis.apache.org
Subject: Re: Question: "Connection.close has already been closed"


Yes, and fill in the DBCP DataSource element with the appropriate values
if you plan to use lazy loading...

Clinton.


On Mon, Aug 18, 2008 at 2:54 PM, Brian Parkinson <parki@avaning.com>
wrote:


	Clinton writes:
	 
	"Make sure the iBATIS TransactionManager is set to EXTERNAL (in
SqlMapConfig.xml or equivalent). "
	 
	Aha. I had no TransactionManager element defined in my
SqlMapConfig. Whoops?
	 
	I was using Spring to configure the datasource:
	 
	 <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="YYY" />  

	  <property name="initialSize" value="10" />
	  <property name="maxActive" value="64" /> 
	  <property name="maxIdle" value="16" />
	  <property name="maxWait" value="1000" />
	 </bean>
	 
	 <bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
	  <property name="dataSource" ref="dataSource" />
	  <property name="configLocation" ref="mapConfig" />
	 </bean>
	 
	but I had no TransactionManager defined in my SqlMapConfig.xml
file. 
	 
	Am I correct in assuming that I just need to add:
	 
	 <transactionManager type="EXTERNAL">
	  <dataSource type="DBCP">
	  </dataSource>
	 </transactionManager>
	 
	to my SqlMapConfig file?
	 
	If so, should I move the properly declarations from the spring
bean (id="dataSource") into the SqlMapConfig file (under the
transactionManager) element?
	 
	Any advice on best practices appreciated - the configuraiton of
the datasource, spring, transaction manager, etc. isn't completely clear
to me.
	 
	Cheers,
	 
	Brian Parkinson...
	 
	 

________________________________

	From: Clinton Begin [mailto:clinton.begin@gmail.com] 
	Sent: Monday, August 18, 2008 4:19 PM
	To: user-java@ibatis.apache.org
	Subject: Re: Question: "Connection.close has already been
closed"
	
	
	Based on the stack trace, it doesn't look like iBATIS ever even
gets the connection... so this looks like a Spring/DBCP related issue.  
	
	That said, if iBATIS prematurely closed the connection and DBCP
didn't check the connection for validity, that would cause this problem.

	
	But the root cause would be why iBATIS is closing the
connection. Make sure the iBATIS TransactionManager is set to EXTERNAL
(in SqlMapConfig.xml or equivalent).  
	
	Clinton
	
	
	On Mon, Aug 18, 2008 at 2:13 PM, Brian Parkinson
<parki@avaning.com> wrote:
	

		Hi all:
		
		I'm using iBatis 2.3.3.720 and Spring and dbcp 1.2.2.
All seems to be
		well, but sometimes I see an exception related to
"Connection.close()
		has already been called".
		
		When this happens, the server is pretty much borked -
any new database
		access results in the exception.
		
		I never call close() in my code - unsure what's going on
here. A quick
		inspection of my logs didn't reveal anything...
		
		Does anyone have any clues?
		
		Any help is appreciated.
		
		       <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="ecobee"
/>
		               <property name="password" value="ecobee"
/>
		               <property name="initialSize" value="10"
/>
		               <property name="maxActive" value="64" />
		               <property name="maxIdle" value="16" />
		               <property name="maxWait" value="1000" />
		       </bean>
		       <bean id="sqlMapClient"
	
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		               <property name="dataSource"
ref="dataSource" />
		               <property name="configLocation"
ref="mapConfig" />
		       </bean>
		
		       <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>
		
		Thanks.
		
		Brian Parkinson
		
		----------- x8 snip
		
		ERROR 15:45:16:428 Error selecting user from dataabase.
		{foundation.schedule.DbConnectionPing.executeTask}
		
		Message: Could not open JDBC Connection for transaction;
nested
		exception is
	
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException:
		Connection.close() has already been called. Invalid
operation in this
		state.
		
		Trace
org.springframework.transaction.CannotCreateTransactionException:
	
org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin
		(DataSourceTransactionManager.java:238)
	
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)
		$Proxy5.getUser(Unknown Source)
		
		>>>
	
com.ecobee.foundation.schedule.DbConnectionPing.executeTask(DbConnection
		Ping.java:27)
		
	
com.ecobee.foundation.schedule.ScheduledService.executeSchedule(Schedule
		dService.java:38)
		sun.reflect.GeneratedMethodAccessor287.invoke(Unknown
Source)
	
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
		Impl.java:25)
		java.lang.reflect.Method.invoke(Method.java:597)
	
org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:275)
	
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
	
$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.ja
		va:272)
	
org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBea
		n.java:86)
		org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java
		:529)
		Message: Connection.close() has already been called.
Invalid operation
		in this state.
		Nested exception trace
	
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException:
	
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
		com.mysql.jdbc.Connection.getMutex(Connection.java:3728)
	
com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5365)
	
org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingCon
		nection.java:331)
	
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.set
		AutoCommit(PoolingDataSource.java:317)
	
org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin
		(DataSourceTransactionManager.java:221)
	
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)
		$Proxy5.getUser(Unknown Source)
		
		>>>
	
com.ecobee.foundation.schedule.DbConnectionPing.executeTask(DbConnection
		Ping.java:27)
		
	
com.ecobee.foundation.schedule.ScheduledService.executeSchedule(Schedule
		dService.java:38)
		sun.reflect.GeneratedMethodAccessor287.invoke(Unknown
Source)
	
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
		Impl.java:25)
		java.lang.reflect.Method.invoke(Method.java:597)
	
org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:275)
	
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
	
$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.ja
		va:272)
	
org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBea
		n.java:86)
		org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java
		:529)
		




Mime
View raw message