【发布时间】:2016-12-08 12:55:38
【问题描述】:
我有一个 Java 应用程序,它每 1 分钟安排一次 cron 作业。它在 Glassfish 4 上运行。我们将 Hibernate 与 JTA Entity Manager 结合使用,后者是用于在 SQL Server 数据库上执行查询的容器管理。
JDBC 连接池设置为:
初始和最小池大小:16
最大池大小:64
池调整数量:4
空闲超时:300
最大等待时间:60000
运行 22 小时后的 JDBC 连接池统计信息:
NumConnUsed 0 个
NumConnAcquired 14404count
NumConnReleased 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 崩溃。
【问题讨论】:
-
你能把作业的代码运行起来吗?您要关闭持久性管理器吗?
-
根据文档“Container Managed Persistence Context——顾名思义——由企业容器管理。容器负责将Persistence Context注入到企业组件中,同时也负责其处置在当前交易结束时。”我们不能在容器管理事务中显式关闭实体管理器,因为它会抛出 IllegalStateException。
-
这是示例代码示例: public Insight findInsightByName(String name) { Context ic;实体管理器 em;洞察 loc = null;尝试 { ic = new InitialContext(); em = (EntityManager) ic.lookup(kTIv5PU); loc = (Insight) em.createQuery("select d from Insight d WHERE d.name = :name ") .setParameter("name", name).getSingleResult(); } catch (NamingException ex) { Logger.getLogger(TInsightDAO.class.getName()).log(Level.SEVERE, null, ex); } 最后 { em = null; ic = 空; } 返回位置; }
-
如何开始 cron 作业?通过 EJB 计时器?
-
日志中是否有任何堆栈跟踪?什么是
com.beonic.tiv5- 你在使用一些自定义连接池吗?你的 Glassfish 崩溃是什么意思 - JVM 完全崩溃了?
标签: java sql-server hibernate jta glassfish-4