2017-11-15 2 views
0

私は、バージョン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から

答えて

0

インターセプタは2種類があります:ISessionスコープと ISessionFactoryスコープ。

アンISessionスコープのインターセプタは、セッションがIInterceptorを受け入れるオーバーロードISessionFactory.OpenSession()メソッド のいずれかを使用して を開いたときに指定されています。

ISession session = sf.OpenSession(new AuditInterceptor()); 

アンISessionFactoryスコープのインターセプタはISessionFactoryを構築する前に Configurationオブジェクトに登録されています。この の場合、指定されたインターセプタは、そのセッションから、 で開かれたすべてのセッションに適用されます。これは、セッションが開かれていなければ真です。 は、使用するインターセプタを明示的に指定しています。複数のセッションが(潜在的に)同時に インターセプタを使用するため、 インターセプタは セッション固有の状態を保存しないよう注意してスレッドセーフでなければなりません。だから、

new Configuration().SetInterceptor(new AuditInterceptor()); 

、基本的には、トランザクションがコミットまたは何されて確認してください可能性があります

if (tx.WasCommitted) { 
// do stuff 
} 

あなたはまた、エンティティ情報を取得するために

public override bool OnSave(object entity, 
           object id, 
           object[] state, 
           string[] propertyNames, 
           IType[] types) 
{ 
    //get entity with 
     if (entity is Entity) { 
       get entity properties: Id etc.. 
      } 
} 

を無効にすることができます。

私はそれが役立つことを願っています...

関連する問題