私は、EclipseLinkJPAを使用して永続層を処理するTomcat7にデプロイされたWebアプリケーションに取り組んできました。
テスト環境ではすべて正常に動作しますが、ファイアウォールが切断されて非アクティブな接続が切断されるため、本番環境で深刻な問題が発生しています。基本的に、接続がしばらく非アクティブである場合、TomcatサーバーとDBサーバーの間にファイアウォールがあり、それを強制終了します。その結果、プールに「古い」接続が残ります。
次にその接続が使用されるとき、「接続がタイムアウトした」SQLException(以下の完全なex.getMessage())を取得するまで、コードは返されません。
EL Fine]:2012-07-13 18:24:39.479--ServerSession(309463268)--Connection(69352859)--Thread(Thread [http-bio-8080-exec-5,5、main])-MY SOに投稿するために置き換えられたクエリ[ELConfig]:2012-07-13 18:40:10.229--ServerSession(309463268)--Connection(69352859)--Thread(Thread [http-bio-8080-exec-5、 5、main])--disconnect [EL Info]:2012-07-13 18:40:10.23--UnitOfWork(1062365884)--Thread(Thread [http-bio-8080-exec-5,5、main]) -トランザクションの外部で読み取りクエリを実行しようとしたときに、通信障害が検出されました。クエリを再試行しています。エラーは次のとおりです:例外[EclipseLink-4002](Eclipse Persistence Services-2.3.0.v20110604-r9504):org.eclipse.persistence.exceptions.DatabaseException内部例外:java.sql.SQLException:Eccezione IO:接続がタイムアウトしました
私はすでにpersistence.xmlでいくつかの構成を試しましたが、ファイアウォール構成にアクセスできないため、これらの方法ではうまくいきませんでした。setCheckConnections()も使用してみました
ConnectionPool cp = ((JpaEntityManager)em).getServerSession().getDefaultConnectionPool();
cp.setCheckConnections();
cp.releaseConnection(cp.acquireConnection());
testOnBorrow、testWhileIdle、およびDBCP Apache Commonsから利用可能なその他の機能を使用して、テストスクリプトで問題を解決することができました。EclipseLink内部接続プールをオーバーライドしてカスタム接続プールを使用する方法を知りたいので、persistence.xmlを使用して内部プールを構成するだけでなく、DBCPに基づいて構成済みのプールを提供できます。
SessionCustomizerを提供する必要があることはわかっていますが、どちらを使用するのが正しいかわかりません。基本的に、JPAのような方法でDBCPのパフォーマンスを維持したいと思います。
私はTomcat7にデプロイしていますが、GFに切り替えてもこの問題は発生しないことはわかっていますが、同じサーバー上の他のWebアプリケーションとの一貫性を保つために、Tomcatを使用したいと思います。