我有一个Java应用程序,每1分钟后安排一个cron作业。它运行在Glassfish 4上。我们将Hibernate与JTA Entity Manager一起使用,该容器管理用于执行SQL Server数据库上的查询。获取连接突然增长,导致服务器崩溃
JDBC连接池设置有:
初始和最小池大小:16
最大池尺寸:64
普尔调整产品数量:4
空闲超时:300
最大等待时间:60000
运行22小时后的JDBC连接池统计数据:
NumConnUsed 0count
NumConnAcquired 14404count
NumConnReleased 14404count NumConnCreated 16count
NumConnFree 16count
获取连接数不断后10天左右下方例外递增和GlassFish 4崩溃。
RAR5117:无法从连接池[com.beonic.tiv5]获取/创建连接。原因:com.sun.appserv.connectors.internal.api.PoolingException:了java.lang.RuntimeException:XAResource.start期间得到了异常:
请建议如何避免Glassfish的崩溃。
你可以把运行作业的代码?你关闭关闭持久性管理器吗? – Gatusko
根据文档 “容器管理的持久性上下文 - 作为名称状态 - 由企业容器管理,容器负责将持久性上下文注入到企业组件中,并且负责在当前的末尾处理它的处置交易。” 我们不能显式关闭容器管理事务中的实体管理器,因为它会抛出IllegalStateException异常。 – Rashmi
这是示例代码示例: public Insight findInsightByName(String name){ \t Context ic; \t EntityManager em; \t Insight loc = null; \t尝试{ \t \t ic = new InitialContext(); \t \t em =(EntityManager)ic.lookup(kTIv5PU); \t \t LOC =(透视)em.createQuery( “从洞察d选择d WHERE d.name =:名称 ”) \t \t \t .setParameter(“ 姓名”,名字).getSingleResult(); \t \t \t } \t赶上(NamingException的前){ \t \t Logger.getLogger(TInsightDAO.class.getName())的日志(Level.SEVERE,空,前)。 \t} \t finally { \t \t em = null; \t \t ic = null; \t} \t return loc; } – Rashmi