14

JBoss 6 から JBoss 7 にアップグレード中です。アプリケーションの性質上、顧客ごとに個別のデータベース インスタンスと、すべての顧客に共通のコア構成データベースがあります。多くの場合、少なくともコア データベースと個々の顧客のデータを 1 回の呼び出しで参照する EJB コードがあり、すべての顧客を通過するいくつかの一般的なバックグラウンド プロセスさえあります。

JBoss 6 では、メソッドに NOT_SUPPORTED トランザクション属性を設定することで問題なく処理されました。ただし、JBoss 7 では、これについて次のエラーが表示されます。

ARJUNA012140: 複数の最後のリソースを追加することは許可されていません。LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@74bec54d[connectionListener=d3ce980 connectionManager=25b47a05 warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1=f9a:50468d1:-5a4c1=1,119c9) を追加しようとしています。 1、branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:14、subordinatenodename=null、eis_name=不明な eis 名 >]))、しかし既に LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@518d0191[connectionListener=1a05d94a connectionManager=135f1cfe warned=false currentXid=false current) を持っています) =< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:13, 下位ノード名=null, eis_name=null不明な EIS 名 >]))

異なるデータベースへのすべての呼び出しを個別の EJB 呼び出しとトランザクションにラップせずに、この問題を回避するにはどうすればよいでしょうか。EJB 呼び出しなどで JBoss トランザクション管理を実際にオフにする方法はありますか?

注: この質問は、追加の発見に基づいて報奨金が開始された後に変更され、特定の問題への焦点を絞り、除外された他の可能性を削除しました。

4

2 に答える 2

19

2 つの提案:

  1. データソースを XA に相当するものに更新することを検討してください。これですべての問題が解決します。ここで邪魔されていると思いますか?
  2. com.arjuna.ats.arjuna.allowMultipleLastResourcesサーバー設定で true に設定することを検討してください。これにより、必要な動作が可能になりますが、残念ながらメソッドだけでなく、アプリ全体に対して.

アップデート:

アプリのトランザクション プロパティが大幅に弱体化するため、複数の 1 フェーズ リソースを有効にすることはお勧めしません。standalone.xmlただし、JBoss 7 でこれを行う場合は、以下を変更して追加する必要があります。

<system-properties>
        <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
</system-properties>

これで、トランザクションのないシステムに遠く及ばないシステムができました。ただし、それでも行うことは、ヒューリスティックな結果が得られた場合に警告することです。

可能であれば、引き続き XA データソースを使用することをお勧めします。

更新 2:

ああ、誰かがこれを読みに来たら、OPとは異なり、コードをさまざまなメソッドに分割できる場合は、コードを再構築し、@TransactionAttribute(REQUIRES_NEW)並列トランザクションを作成するために使用することをお勧めします. これは、複数の 1PC をオンにするよりは優れていますが、XA をオンにするほどではありません。

于 2012-09-11T16:40:55.583 に答える
10

OK、JBoss6 とは異なり、データ ソースを取得するための検証ロジックに関する限り、NOT_SUPPORTED トランザクションは依然としてトランザクションであることがわかりました。

これを回避する方法は、EJB 全体を Bean 管理のトランザクションにすることです。

@TransactionManagement(TransactionManagementType.BEAN)

残念ながら、この方法をメソッドごとに制御したい場合があるため、ある程度の柔軟性が制限されますが、それほど面倒な回避策ではありません。

于 2012-09-10T19:30:40.360 に答える