私は、バージョン3.xから4.xへの春と冬眠のアップグレードに取り組んでいます。 古いバージョンではすべて正常に動作しますが、新しいバージョンにアップグレードした後は奇妙なエラーが発生します。hibernateインターセプタを実行した後、セッションをspringトランザクションで管理します。
今私の研究によれば、問題はインターセプターのようです。すべてがうまく動作するよりも、私が休止状態のインターセプタをコメントアウトすると。
どのように問題が発生するか:アプリケーション全体で春管理トランザクションを使用しており、ApplicationContextAwareでhibernateインターセプタのスプリングサービスにアクセスしています。ですから、ある問合せが次の問合せよりもインターセプタから実行されると、セッションが近いというエラーが表示されます。私がもう一度述べたように、すべてのものが見つかるよりも、私が傍受者からの質問をコメントアウトすると、
私は複数のセッションファクトリとトランザクションマネージャを持っています。 私の構成は以下の通りです:
<bean class="com.test.MyInterceptor">
<constructor-arg type="java.lang.String" value="my_config" />
/bean>
<bean id="sf" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="Ds"/>
<property name="mappingResources">
<list>
<value>....</value>
</list>
</property>
<property name="entityInterceptor" ref="myInterceptor" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">...</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.c3p0.minPoolSize">...</prop>
<prop key="hibernate.c3p0.maxPoolSize">...</prop>
<prop key="hibernate.c3p0.timeout">120</prop>
<prop key="hibernate.c3p0.max_statement">..</prop>
<prop key="hibernate.c3p0.unreturnedConnectionTimeout">600</prop>
<prop key="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckin">false</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">true</prop>
<prop key="hibernate.default_batch_fetch_size">5</prop>
</props>
</property>
</bean>
<bean id="transactionTx" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sf"/>
</bean>
のように私の迎撃やサービスが見えます:エラースタックトレースがある
public class MyInterceptor extends EmptyInterceptor implements ApplicationContextAware {
private ApplicationContext context;
@Override
protected void handleAfterTransactionCompletion(Transaction arg0) throws CallbackException {
// after executing this it breaks my spring transaction.
Entity entity = service.get(id);
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
this.context = context;
}
}
public class ServiceImple {
......................
...................
@Transactional
public Entity get(long id) {
return dao.get(id);
}
}
:設定が正しい
(main) SessionImpl ERROR: HHH000087: Exception in interceptor afterTransactionCompletion()
org.springframework.orm.hibernate4.HibernateSystemException: This TransactionCoordinator has been closed; nested exception is org.hibernate.ResourceClosedException: This TransactionCoordinator has been closed
at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:218)
at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:344)
at org.springframework.orm.hibernate4.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:309)
at org.springframework.orm.hibernate4.HibernateTemplate.get(HibernateTemplate.java:419)
at org.springframework.orm.hibernate4.HibernateTemplate.get(HibernateTemplate.java:412)
at code......................
at sun.reflect.GeneratedMethodAccessor95.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy70.get(Unknown Source)
at code......................
at org.hibernate.internal.SessionImpl.afterTransactionCompletion(SessionImpl.java:508)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.afterTransaction(TransactionCoordinatorImpl.java:151)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.afterTransactionCompletion(JdbcTransaction.java:138)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
Caused by: org.hibernate.ResourceClosedException: This TransactionCoordinator has been closed
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.getTransaction(TransactionCoordinatorImpl.java:191)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.isTransactionInProgress(TransactionCoordinatorImpl.java:167)
at org.hibernate.internal.SessionImpl.afterOperation(SessionImpl.java:476)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2456)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:949)
at org.springframework.orm.hibernate4.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:427)
at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:341)
てみましょう私だけ書かれた必要なクラス、私たちは必要以上に知っている。任意の助けに感謝されます。 NHibernate documentationから