我有一个Java应用程序,每隔1分钟就会安排一个cron作业。它运行在Glassfish 4上。我们使用Hibernate和JTA实体管理器,它是用于在SQL Server数据库上执行查询的容器管理。
JDBC连接池设置为:
初始和最小池大小:16
最大泳池面积:64
池调整数量:4
空闲超时:300
最长等待时间:60000
运行22小时后的JDBC连接池统计信息:
NumConnUsed 0count
NumConn获得14404count
NumConn发布了14404count
NumConnCreated 16count
NumConnFree 16count
获取的连接数继续递增,Glassfish 4在大约10天后崩溃,但有以下异常。
RAR5117:无法从连接池[com.beonic.tiv5]获取/创建连接。原因:com.sun.appserv.connectors.internal.api.PoolingException:java.lang.RuntimeException:在XAResource.start期间出现异常:
请建议如何避免Glassfish崩溃。
答案 0 :(得分:0)
finally
{
em = null;
ic = null;
}
我认为这是你永远不会提交或关闭交易的问题 Giving this example and documentation of JTA check 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();
}
这是进行交易的正确方法。但是你只是将这些数值归零,仅此而已,这就是为什么你的游泳池没有被关闭的原因 Here is more documentation about Transactions
答案 1 :(得分:0)
很难说出问题的真正原因是什么,但问题可能是你的所有连接都已陈旧,因为长时间没有使用。
最好设置连接验证,以确保在外部服务器关闭时重新打开连接。
有一篇关于connection pools in Glassfish/Payara的详尽文章,结帐时特别是关于Connection validation
的部分(在示例中使用了Derby DB):
打开连接验证:
asadmin设定 resources.jdbc连接-pool.test-pool.connection验证法=定制验证
asadmin设定 resources.jdbc连接-pool.test-pool.validation-类名= org.glassfish.api.jdbc.validation.DerbyConnectionValidation
的asadmin 组 resources.jdbc连接-pool.test-pool.is连接验证-需要=真