【发布时间】:2012-07-16 14:52:23
【问题描述】:
我一直在开发一个 Web 应用程序,部署在 Tomcat 7 上,它使用 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 Config]:2012-07-13 18:40:10.229--ServerSession(309463268)--Connection(69352859)--Thread(Thread[http-bio-8080-exec-5,5,main])--断开连接 [EL信息]:2012-07-13 18:40:10.23--UnitOfWork(1062365884)--Thread(Thread[http-bio-8080-exec-5,5,main])--通讯 尝试在外部执行读取查询时检测到失败 交易。正在尝试重试查询。错误是:异常 [EclipseLink-4002](Eclipse 持久性服务 - 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 上。
【问题讨论】:
标签: jpa eclipselink apache-commons-dbcp