Open Session in View Patternを探しています。基本的に、アプリケーションの起動時に Session をスレッドにバインドし、アプリケーションの存続期間を通じて同じ Session を使用する必要があります。セッションを次のように保持するシングルトン util クラスを作成することで、これを行うことができます (例では のEntityManager
代わりにを使用してSession
いますが、コードは本質的に同じになります)。
private static EntityManager entityManager;
public static synchronized void setupEntityManager() {
if (entityManager == null) {
entityManager = entityManagerFactory.createEntityManager();
}
if (!TransactionSynchronizationManager.hasResource(entityManagerFactory)) {
TransactionSynchronizationManager.bindResource(entityManagerFactory, new EntityManagerHolder(entityManager));
}
}
public static synchronized void tearDownEntityManager() {
if (entityManager != null) {
if (entityManager.isOpen()) {
entityManager.close();
}
if (TransactionSynchronizationManager.hasResource(entityManagerFactory)) {
TransactionSynchronizationManager.unbindResource(entityManagerFactory);
}
if (entityManagerFactory.isOpen()) {
entityManagerFactory.close();
}
}
}
Open Session in View パターンに関連する固有のリスクがあることに注意してください。たとえば、アプリケーションでスレッドを使用するつもりであるというコメントに気付きました。セッションはスレッドセーフではありません。そのため、スレッド化された方法でデータベースにアクセスしようとしていないことを確認する必要があります.*
また、コレクションの取得戦略にも注意する必要があります。開いているセッションと遅延読み込みでは、データベースに過度の負荷をかける可能性が常にあります。
*以前、NetBeans アプリケーションでこのアプローチを使用したことがありますが、これは特定のタスクにスレッドを使用することを知っています。問題はありませんでしたが、多くのリスクがあることに注意する必要があります。
編集
状況によっては、ドメイン オブジェクトをセッションから削除し、切り離されたオブジェクトを後で使用できるようにキャッシュすることもできます。この戦略では、ドメイン オブジェクトが頻繁に更新されないようにする必要があります。更新しないと、アプリケーションが不必要に複雑になります。