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)