我一直在开发一个部署在 Tomcat 7 上的 Web 应用程序,它使用 EclipseLink JPA 来处理持久层。
在测试环境中一切正常,但由于防火墙切断了非活动连接,我们在生产环境中遇到了严重问题。基本上,如果连接在一段时间内处于非活动状态,则位于 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])--我的已替换查询以将其发布到 SO [EL 配置]:2012-07-13 18:40:10.229--ServerSession(309463268)--Connection(69352859)--Thread(Thread[http-bio-8080-exec-5, 5,main])--断开[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 内部连接池以使用自定义连接池,以便我可以提供基于 DBCP 的已配置池,而不仅仅是使用 persistence.xml 配置内部连接池。
我知道我应该提供一个 SessionCustomizer,我不确定哪一个是正确的模式。基本上我想以类似 JPA 的方式保留 DBCP 的性能。
我在 Tomcat 7 上进行部署,我知道如果我切换到 GF,我不会遇到这个问题,但是为了与同一服务器上的其他 webapp 保持一致,我更愿意留在 Tomcat 上。