EJB3 環境でコンテナ管理の EntityManager インスタンス (@PersistenceContext を使用) を作成する単一の Statelebean を作成する必要があります。作成されたこの単一のステートレス Bean で、特定の時間間隔で実行されるスレッドを作成します。このスレッドは何ヶ月も続くでしょう。コンテナーから (CMP を使用して) 取得した単一の EntityManager インスタンスが、全期間 (> 1 年) 使用できるかどうかについては疑問があります。
2 に答える
EntityManager は、トランザクション空間を表すことを意図しているようです。私には、長寿命のスレッドの存続期間全体に単一のトランザクション空間を使用することは意味がありませんが、これがどれほど実現可能かは、設計とプロバイダーの実装に依存します。単一の EM を使用する場合は、EM がスレッド間で共有されていないことを確認し、そのリソースの使用状況を監視します。これは、JPA がそれらを介して読み取ったすべてのエンティティをマネージド インスタンスとしてキャッシュするために必要なためです。場合によっては em.clear() を呼び出してマネージド インスタンスをデタッチし、論理ポイントでガベージ コレクションを実行できるようにすることもできます。
コンテナーは、スレッドの寿命ではなく、注入される Bean の寿命に EntityManager を結び付ける必要があるため、注入は機能しないと思います。EntityManagerFactory を取得し、スレッドの独自の EntityManager ライフサイクルを取得/管理する必要があります。
EntityManager の寿命について: DB 接続の寿命の問題だと思います。この場合、JPA プロバイダーが接続タイムアウトを検出すると、JDBC 接続文字列を構成するautoReconnect=true
と、別の接続が構築されることが予想されます。また、大きなタイムアウトを設定する可能性を探す必要があります。
反対に、EJB では新しいスレッドを開くことが許可されていないことをおそらく無視します。あなたの場合、管理されたエンティティ(異なるスレッドで変更される)とトランザクションの問題に関しては、いくつかの問題があります。代わりに、Timer Serviceを使用します。