0

私たちはいくつかの処理を行ういくつかのサービスBeanを持っており、セットを反復して各エントリの非同期スレッドを開始しますなどは、以下:Springブートは@Asyncメソッドへのトランザクション(およびdb接続)を反映します

@Service 
public class ServiceBean { 
    @Autowired 
    private AsyncHandler asyncHandler; 

    public void doService(Set<?> theSet) { 
    for (Object obj : theSet) { 
     Future<?> future = asyncHandler.doHandle(obj); 
     // ... 
    } 
    // wait for all futures to complete 
    } 
} 

@Service 
public class AsyncHandler { 
    @Async 
    public Future<?> doHandle(Object object) { 
    // dosth 
    return future; 
    } 
} 

は、今、私たちは、それぞれのスレッドが独自のトランザクションと接続プールが非常に高速に空に実行するようになります、それによってデータベース接続を保持することを参照してください。

すべてのスレッド間でトランザクションを共有するための望ましい方法は何ですか?

ありがとうございます!

+3

できません。トランザクションと接続はThreadLocalに格納されます。トランザクションを複数のスレッドにまたがることはできません。同時スレッドの量を制限するのが最も簡単な解決策です。 –

+0

"あなたはできない" ...私はあなたができることを賭けることができる、おそらく春をカスタマイズする必要があるだろう。 ThreadLocal内のトランザクションでは、新しいスレッドでトランザクションを取得して設定する可能性があります。 – Benny

+0

M. Dienum correct私は自分の答えを削除しました。 –

答えて

4

すべてのスレッド間でトランザクションを共有するための望ましい方法は何ですか?

しないでください。それは何が起こっているのかを理解することは非常に困難です。トランザクションがそれを作成したスレッドにアタッチされるのは、理由があります。あなたの計画は、これらの非同期スレッドをすべて開始してからコミット信号を送信するのを待つことだと思います。

あなたがそうしないと、誰が取引を完了するのですか?スレッドがトランザクションをロールバックすると、まだそれを使用している他のスレッドはどうなりますか?あなたは明らかに約Connectionを渡すことができましたが、ほとんどの接続の実装が様々な場所で​​を使用しているので、私は物事がシリアル化されることを期待しています。

関連する問題