1

REQUIRES_NEW 伝播を使用して 2 つ目のサービスを呼び出すトランザクション サービスがあります。

ログのアクティブ化 サブトランザクションを作成するときに、Spring が新しい Hibernate セッションを作成することを確認しましたが、現在のスレッドに対して既に開いているセッションがあります。

[DEBUG] org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource.getTransactionAttribute(AbstractFallbackTransactionAttributeSource.java:106) Adding transactional method 'executeProcessed' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; ''
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doGetTransaction(HibernateTransactionManager.java:437) Found thread-bound Session [org.hibernate.impl.SessionImpl@467743d7] for Hibernate transaction
[DEBUG] org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:415) Suspending current transaction, creating new transaction with name [com.microsigns.ds.businesslogic.rendering.service.impl.PipelineDataServiceImpl.executeProcessed]
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:493) **Opened new Session** [org.hibernate.impl.SessionImpl@3d4b1aad] for Hibernate transaction
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:504) Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@3d4b1aad]
[DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:569) Exposing Hibernate transaction as JDBC transaction [jdbc:postgresql://localhost:5432/ds, UserName=microsignsdds, PostgreSQL Native Driver]

セッションを再利用する方がパフォーマンスの面で優れているのではないでしょうか? これにより、サブトランザクションでオブジェクトをリロードまたは再アタッチする必要もなくなります。ここで何が欠けていますか?

この動作は、org.springframework.orm.hibernate3.HibernateTransactionManager でハードコーディングされています。

xObject.getSessionHolder().setSynchronizedWithTransaction(true);

休止状態 3.6 と Spring 3.1 を使用しています

4

1 に答える 1

5

いいえ、セッションを再利用すべきではありません。新しいトランザクションが必要な場合は、サブ トランザクション内のすべてを変更、コミット、ロールバックできる必要があります。ハイバネート セッションは、トランザクション データを保持するトランザクション キャッシュと考えることができます。

于 2012-09-17T20:03:22.853 に答える