8

プロジェクトをSpring3.0+hibernate3.6.xからS3.1+H4.1に移行しています

私の新しいコードは次のとおりです

    <context:component-scan base-package="x.y.z">
</context:component-scan>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
 <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.x</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
  </props>
     </property>
        <property name="annotatedClasses">
      <list>
        <value>x.y.z.entities.Student</value>        
         </list>
    </property>
  </bean>

<bean id="transactionManager" 
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

<aop:config>
    <aop:pointcut id="daoServicePoint" 
            expression="execution(* x.y.z.StudentDao.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="daoServicePoint"/>
  </aop:config>

  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="save*" propagation="REQUIRED"/>
       <tx:method name="update*" propagation="REQUIRED"/>
       <tx:method name="delete*" propagation="REQUIRED"/>
     <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
  </tx:advice> 

getStudentメソッドマーカーをSUPPORTSとして実行し、読み取り専用で取得している場合

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)

以前はSpring3.0とHibernate3.6.xで問題ありませんでしたが、現在は変更されています。Springフォーラムから、使用する必要がある場合はマークトランザクションが必要であると理解しました。sessionFactory.getCurrentSession();

コードで最大の同時速度を得るために、より低いレベルの手法を使用しました。いくつかのget/save / update /クエリを必要とする操作を実行するとき、私はそれを次のように行いました:

  1. としてマークされたメソッドと呼ばれSUPPORTSます。
  2. SUPPORTS最初のメソッド内としてもマークされているすべてのgetクエリを実行しました。
  3. 次に、同じメソッド内としてマークされたクエリを開始しましたREQUIRED。これは、ロール可能なバックトランザクションが開始されるポイントです。

この手法を使用するとパフォーマンスが向上しましたが、すべてのメソッドをREQUIREDとしてマークすると破棄されます。

どうすればそれを回避できますか?

4

2 に答える 2

3

Spring と Hibernate 3/4 を試したときに同じ問題が発生しました。

これは既知の問題のようで、次の JIRA リンクで説明されています。

https://jira.springsource.org/browse/SPR-9020

開いている既存のトランザクション/セッションがなく、呼び出されたメソッド @Transactional が Propagation = Propagation.SUPPORTS で構成されている場合、SpringSessionContext の Hibernate 4 バージョンは新しいセッションを開かないようです。

于 2013-08-24T17:38:18.643 に答える
0

トランザクションを読み取り専用としてマークできると思います。パフォーマンスに影響があるかどうかはわかりません。

于 2012-07-02T19:04:25.007 に答える