2012-04-25 12 views
2
私は春、関連する設定で休止状態を使用してい

AbstractRoutingDataSource.determineCurrentLookupKey()が@Transactionalブロック内で呼び出されないのはなぜですか?

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

<bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
    <property name="sessionFactory"><ref bean="sessionFactory" /></property> 
</bean> 

<tx:annotation-driven /> 
<aop:aspectj-autoproxy /> 
+0

任意のコード、設定ですか? –

答えて

4

はそれについて考えて...

  1. いくつかのコードがDataSourceからConnectionを取得したいと考えています。おそらく、トランザクションを開始し、

  2. AbstractRoutingDataSourceいくつかのSQLクエリを実行するために利用可能なもののセットから、適切なDataSourceを見つけるためにdetermineCurrentLookupKey()を実行

  3. ルックアップキーは現在DataSourceを取得するために使用されます。 AbstractRoutingDataSourceは、そのデータソースからJDBC接続を返します。

  4. 通常のソースのように、AbstractRoutingDataSourceから接続が返されます。

ここで、トランザクション内でdetermineCurrentLookupKey()が実行されていない理由を質問していますか?最初のSpringは、トランザクションを開始するために必要なデータベース接続をフェッチするために、ポイント1に移動する必要があります。次の点を見てください。問題を参照してください?私に無限の再帰のような匂いがする。

簡単に言えば、 - determineCurrentLookupKey()はトランザクションが接続を必要とするため、トランザクション内で実行できません。その方法の目的は、接続を取得するために使用するDataSourceを特定することです。参照:Chicken or the egg

同様に、エンジニアはコンピュータを使用して最初のコンピュータを設計することはできませんでした。

+0

これは実際には正しくありません。 Hibernateは定義されたAbstractRoutingSourceを使用してDataSourceを決定するための呼び出しを行います。ただし、デフォルトのSpring設定では、セッションが終了するまで(release_mode)接続を保持します。 – Art

+0

@arturnt:私は理解できません。どのセッションを参照しているのか、また「デフォルトのSpring設定」は何を意味するのかを少し明確にすることはできますか? 'AbstractRoutingSource'から最初にフェッチされなければならないセッション/トランザクションはありません。 –

+0

上記の設定をいくつか追加しました。 SpringのTransactionalインターセプタはTransactionをセットアップします。もしあなたのHibernateセッションにまだ関連付けられていなければ、DataSourceから新しい接続をフェッチします。 OSIVフィルタ/インターセプタでは、セッションはリクエスト全体に関連付けられます。 – Art

関連する問題