获得的连接突然增长导致服务器崩溃

时间:2016-12-08 12:55:38

标签: java sql-server hibernate jta glassfish-4

我有一个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崩溃。

2 个答案:

答案 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连接验证-需要=真