我有一个Java应用程序,它每隔1分钟就安排一次cron作业。我们使用Hibernate和JTA实体管理器一起管理容器,用于执行SQL Server数据库上的查询。
JDBC连接池设置如下:
初始和最小池大小:16
最大池大小:64
池调整数量:4
空闲超时:300
最大等待时间:60000
运行22小时后的JDBC连接池统计:
NumConnUsed 0计数
NumConnAcquired 14404计数
NumConnReleased 14404计数NumConnCreated 16计数
NumConnFree 16计数
获得的连接数量不断增加,Glassfish 4在大约10天后崩溃,只有以下例外。
RAR5117 :无法从连接池com.beonic.tiv5获得/创建连接。原因: com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException:在XAResource.start期间异常:
请建议如何避免玻璃鱼坠毁。
发布于 2016-12-08 13:53:40
finally
{
em = null;
ic = null;
} 我认为这是一个问题,你永远不会背诵或关闭传输给出JTA检查5.2.2的示例和文档
// BMT idiom
@Resource public UserTransaction utx;
@Resource public EntityManagerFactory factory;
public void doBusiness() {
EntityManager em = factory.createEntityManager();
try {
// do some work
...
utx.commit();
}
catch (RuntimeException e) {
if (utx != null) utx.rollback();
throw e; // or display error message
}
finally {
em.close();
}这是进行转运的正确方法。但是,您只是在对值进行空化,而不是更多,这就是为什么您的池没有被关闭以下是有关事务的更多文档的原因。
发布于 2016-12-09 08:48:44
很难说问题的真正原因是什么,但问题可能是,所有的连接都变得陈旧,因为很长时间没有使用。
设置连接验证是一种很好的做法,它可以确保连接在外部服务器关闭时重新打开。
有一篇关于玻璃鱼/Payara中的连接池的详细文章,特别是关于Connection validation的部分(在示例中使用Derby ):
打开连接验证: asadmin set resources.jdbc-connection-pool.test-pool.connection-validation-method=custom-validation 管理集resources.jdbc-connection-pool.test-pool.validation-classname= org.glassfish.api.jdbc.validation.DerbyConnectionValidation和管理集resources.jdbc-connection-pool.test-pool.is-connection-validation-required=true
https://stackoverflow.com/questions/41040060
复制相似问题