2017-08-27 22 views
0

私はJavaEEでREST APIを構築しています。私はTomEEをアプリケーションサーバーとして使用しています。私は、GETPOSTDELETEのメソッドを持つ自分のRESTfullクラスにメソッドを提供するために、Singleton JPA DAOをPostgresデータベースに、Statelessにサービスを提供しています。今まで私はURLルートをテストするのにrest assuredを使用しています。すべてが正常に動作しているが、私は私のシステムを強調したかったので、私はこれでした:どのように並行処理を正しく扱うか?

java.lang.IllegalStateException: Transaction already active 

どのように行うことができます

Runnable r1 =() -> { 
     for (int i = 0; i < 10; i++) { 
      RegisterAndLogService service = new RegisterAndLogService(); 
      //lots of service calls 
     } 
    }; 

    Runnable r2 =() -> { 
     for (int i = 0; i < 10; i++) { 
      RegisterAndLogService service2 = new RegisterAndLogService(); 
      //lots of service calls 
     } 
    }; 
    Thread t1 = new Thread(r1); 
    Thread t2 = new Thread(r2); 
    t1.start(); 
    t2.start(); 

をしかし、私のスレッドの1に2回目の反復が始まるだろうというとき、私はこれを得ました私はDAOの再募集を積み重ねて、現在の取引を待っている間に適切に1つずつ処理します。 EJB/JPAは何らかの形でこれに関与できますか?要求を保存し、できるだけ早くそれらに対処するには?

答えて

1

あなたがここで何をしているのか、お望みの問題がテストコードかテスト中のAPIか、APIの背後にあるのかを理解することは難しいです。

しかし、あなたは何かは次のように何かをやっていることを意味し、「すでにアクティブトランザクション」になっている場合:複数のスレッド(ない)で、単一のJPAトランザクションマネージャを使用しようとして

  • を、
  • 同じスレッドで複数の同時トランザクションを実行しようとしていますか、または
  • トランザクションをクリーンアップしていません(コミットまたはロールバック)。最後のケースでは

、あなたはがそれをロールバックせずに例外を経由して取引を担当するコード領域から「脱出」することができます例を探します。

トランザクション、トランザクションマネージャ、およびスレッド間の関係を理解するために使用しているJPAのドキュメントを参照することをお勧めします。


私は私の場合は最初の1であると信じて - 複数のスレッドで単一JPAトランザクションマネージャを使用しようとしています。ステートレスBeanのインスタンスが多数要求されているときに、単一のJPAトランザクションマネージャを維持することについての設計パターンや良い方法はありますか?

唯一の方法は、各スレッドが独自のトランザクションマネージャを持つことです。各スレッドは独自のTMをプログラマチックに作成(および解放)する必要があります。そうしないと、フレームワークに依存することになります。例えば様々な注釈によって指示される。

TMオブジェクトは、軽量(すなわち、インスタンス化するのに安価)かつスレッドセーフではないように設計されている。スレッドにそれらを共有しないでください。それらをリサイクルする必要はありません。


1 - ...あなたはは、複数のスレッドにまたがるが必要であることを、単一のJPAトランザクションを持っていない限り。そのためには、 "それを行う方法"があります。

+0

ありがとうございます。私は自分のケースが最初のものであると信じています(複数のスレッドを持つ単一のJPAトランザクションマネージャを使用しようとしています)。ステートレスBeanのインスタンスがたくさん要求されている間に、単一のjpaトランザクションマネージャーを維持することに関する設計パターンはありますか? – GabrielRado

関連する問題