Hibernate、c3p0、Guice、Guice-persistを使用すると、トランザクション後にデータへの接続がプールに解放されないという奇妙な問題が発生します。
これは、 JpaPersistServiceが実行される方法に関連しているようで、EntityManagerをthreadLocal変数にキャッシュします。
private final ThreadLocal<EntityManager> entityManager = new ThreadLocal<EntityManager>();
私の質問は次のとおりです。
- guice-persistを削除し、これを新しいentityManagerを作成するものに置き換えて、必要なたびに閉じる必要がありますか(ここで提案されています)?
- または、entityManagerをキャッシュするのが方法であり、他の何かで問題を修正する必要がありますか?
(私たちの問題:1)従来の8時間のタイムアウト後にmysqldによってmysql接続が切断されたため、entityManagerは使用できなくなりました。c3p0のキープアライブを有効にすることで解決できますが、アプリケーションが長期間使用されない場合があるため、無駄なアクティブな接続を維持しないようにします。2)各EntityManagerは何らかのキャッシュを実行しているようであり、エンティティはentityManager間で一貫性がありません。それを解決する方法を見ていませんでした)