2012-05-11 19 views
2

StatelessSessionBeanでパフォーマンスの低いビジネスメソッドがあります。パフォーマンスを向上させるために、このビジネスメソッドを複数の非同期メソッド呼び出しに分割したいと考えています。Java EEの非同期メソッドを使用したトランザクション管理

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

答えて

4

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

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

あなたのオプションは何ですか?まず、すべてのSQLクエリを並列化する(特に書き込み - 1つのトランザクションでそれらを持つ必要があります)、あまり効果がありません。データベースは通常I/Oに束縛されています。並列化は、CPUを大量に使用するタスクがある場合や、何かを待っている場合にのみ有効です。

どちらの場合も、複数のスレッドで並列コードを実行するコードを再設計し、データベースとトランザクションを処理する書き込みスレッドは1つしかありません。たとえば、10台のサーバーを呼び出す必要がある場合は、レスポンスを収集して格納します.10個のスレッドを生成する/プールを使用し、結果を待ってすべてのスレッドを1つのスレッドに格納します。

は、データベースがビジネスの方法によって改変されていない

+0

も参照してください。読み取り専用操作です。問題は、データベースのスナップショットで確実に動作することです。私。ビジネスメソッドが実行されている間に他の人が行ったデータベースへの変更が考慮されていないことを確認する必要があります。したがって、私たちは「再読可能な読み取り」トランザクションを使用しました。 – woelfle

+0

データベースとは何ですか? – Nicholas

+0

MySQLのInnoDBデータベース – woelfle

関連する問題