3

StatelessSessionBean にパフォーマンスの悪いビジネス メソッドがあります。パフォーマンスを改善するために、このビジネス メソッドをいくつかの非同期メソッド呼び出しに分割したいと考えています。

問題は、これらの非同期メソッドを同じトランザクションで実行する必要があることです (同じ JPA エンティティ マネージャーを使用する必要があります)。私が Java EE 仕様を理解している限り、これはコンテナー管理トランザクションを使用して行うことはできません。Bean 管理トランザクションまたはその他のメカニズムを使用して、この要件を実現することは可能ですか?

4

1 に答える 1

4

これは、標準の EJB でも拡張機能でも行うことができません。トランザクションはデータベース接続に関連付けられているため、複数のスレッド間でその接続を共有する必要があります。これは安全ではありません。

また、非同期コードは、CPU 負荷が高い場合など、何らかの理由で大きな遅延を伴って実行される場合があります。これにより、トランザクションが不必要に長い間開かれたままになります。

あなたの選択肢は何ですか?まず第一に、SQL クエリを並列化しても (特に書き込み - 1 つのトランザクションで行う必要があります)、あまり効果がありません。データベースは通常、I/O バウンドです。並列化は、CPU を集中的に使用するタスクがある場合、または何かを待っている場合にのみ時間をかける価値があります。

どちらの場合も、コードを再設計して、複数のスレッドで並列コードを実行し、ライター スレッドを 1 つだけにして、データベースとトランザクションを処理します。たとえば、10 台のサーバーを呼び出す必要がある場合は、応答を収集して保存します。10 個のスレッドを生成し、プールを使用して、結果を待ち、それらすべてを 1 つのスレッドに保存します。

こちらもご覧ください

于 2012-05-11T10:52:53.340 に答える