ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Clinton Begin" <clinton.be...@gmail.com>
Subject Re: Question: "Connection.close has already been closed"
Date Mon, 18 Aug 2008 20:19:26 GMT
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