3

何日も自分のアプリケーションで Spring トランザクションを適切に動作させようとしてきましたが、今ではコミュニティに頼るしかありません。よろしくお願いします。

私のアプリケーションには、保護されたオーバーライドされたメソッドに @Transactional で注釈を付け、抽象親クラスからこのメソッドを呼び出す必要があるという特定の要件があります。私が読んだことから、プロキシは使用できず、mode=aspectj を使用する必要があります。

まず、いくつかの構成:

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="false" mode="aspectj" />

<context:load-time-weaver />

<bean name="ID_DataAccessor" class="dal.DataAccessor">
    <constructor-arg ref="dataSource" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost" />
           .....
    <property name="defaultAutoCommit" value="true" />
</bean>

ID_DataAccessor のメソッドで @Transactional アノテーションを使用すると、接続はトランザクション ( DataSourceUtils.isConnectionTransactional(c, dataSource) == true) になります。ただし、メソッドが完了するとすぐにトランザクションがコミットされるため、これは役に立ちません。DataAccessor のメソッドを呼び出すメソッドで @Trasnactional を使用すると、(から) DataAccessor で取得された接続DataSourceUtils.getConnection(dataSource)はトランザクションではありません。さらに、DataSourceTransactionManager.doGetTransaction() にブレークポイントを配置しました。これは、@Transactional アノテーションが接続を取得するメソッドに直接ある場合にのみ呼び出されます。用語をオーバーロードして申し訳ありませんが、@Transactional アノテーションがスタックに反映されていないようです。

私は完全に困惑しています。助けてください!:)

4

1 に答える 1

4

私はちょうどこれをあきらめました。それは非常に明白ではありませんでした。問題は、エントリ ポイントでEndOfDayProcessクラスを使用することによって発生します。クラスがロードされ、より一般的には、 *Process および *EntryPoint クラスのいずれかに拡張されるため、これは問題です。コードのその時点では、Spring はまだ開始されていないため、ロード時のウィーバーはアクティブではなく、トランザクション コードが組み込まれることなく、クラスは正常にロードされます。もちろん、クラスは 1 回だけロードされるため、残ります。Spring で Bean を作成すると、@Transactional アノテーションが付けられていることを除いて、トランザクションとは何の関係もないタイプの Bean になります。しかし、それまでに、彼らに会う人はもう誰もいません。考えられる (良い) 解決策が 2 つあります。

  1. ビルド時のウィービングに切り替えます。その場合、織り込む前にクラスをロードすることはできません。
  2. エントリ ポイントに基づいて、使用する *Process Bean を決定する方法を変更します。*Process クラスをロードする原因となるものを除いて、好きなものを使用してください。
于 2011-10-16T20:58:24.453 に答える