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:34 GMT
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