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 21:04:58 GMT
PS:  This is all assuming Spring doesn't just override all of those settings
anyway... :-)


On Mon, Aug 18, 2008 at 3:04 PM, Clinton Begin <clinton.begin@gmail.com>wrote:

> 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