Java批处理任务异常:__TimerPool连接池无法获取连接及执行器缓慢问题
问题分析与解决方案
问题背景
我在CentOS 6系统的Glassfish 4.1(Build 13)上配置了一个基于Chunk的XML JBatch任务,即使在高负载下也能稳定运行。但近期在CentOS 7系统上采用相同Glassfish版本及默认配置部署后,任务运行及完成出现严重问题:执行速度明显缓慢,且持续出现一系列连接池相关错误。
报错日志
[2018-05-14T06:05:28.079+0300] [glassfish 4.1] [SEVERE] [poolmgr.component_register_exception] [javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.rm] [tid: _ThreadID=209 _ThreadName=concurrent/batchDispatchExecutor-managedThreadFactory-Thread-5] [timeMillis: 1526267128079] [levelValue: 1000] [[ RAR5029:注册组件时出现意外异常 javax.transaction.RollbackException at com.sun.jts.jta.TransactionImpl.registerSynchronization(TransactionImpl.java:305) at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.startJTSTx(JavaEETransactionManagerSimplified.java:439) at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.enlistLAOResource(JavaEETransactionManagerJTSDelegate.java:318) at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.enlistResource(JavaEETransactionManagerSimplified.java:356) at com.sun.enterprise.resource.rm.ResourceManagerImpl.registerResource(ResourceManagerImpl.java:152).... ]] [2018-05-14T06:05:28.080+0300] [glassfish 4.1] [WARNING] [poolmgr.err_enlisting_res_in_getconn] [javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.pool] [tid: _ThreadID=209 _ThreadName=concurrent/batchDispatchExecutor-managedThreadFactory-Thread-5] [timeMillis: 1526267128080] [levelValue: 900] [[ RAR7132: 无法在事务中登记资源,将资源返回至连接池。连接池名称: [ __TimerPool ]]] [2018-05-14T06:05:28.080+0300] [glassfish 4.1] [WARNING] [poolmgr.get_connection_failure] [javax.enterprise.resource.resourceadapter.com.sun.enterprise.connectors] [tid: _ThreadID=209 _ThreadName=concurrent/batchDispatchExecutor-managedThreadFactory-Thread-5] [timeMillis: 1526267128080] [levelValue: 900] [[ RAR5117 : 无法从连接池 [ __TimerPool ] 获取/创建连接。原因: com.sun.appserv.connectors.internal.api.PoolingException: javax.transaction.RollbackException]] [2018-05-14T06:05:28.081+0300] [glassfish 4.1] [WARNING] [jdbc.exc_get_conn] [javax.enterprise.resource.resourceadapter.com.sun.gjc.spi] [tid: _ThreadID=209 _ThreadName=concurrent/batchDispatchExecutor-managedThreadFactory-Thread-5] [timeMillis: 1526267128081] [levelValue: 900] [[ RAR5114 : 分配连接出错 : [分配连接失败,原因: javax.transaction.RollbackException]]] [2018-05-14T06:05:28.081+0300] [glassfish 4.1] [WARNING] [] [com.ibm.jbatch.container.services.impl] [tid: _ThreadID=209 _ThreadName=concurrent/batchDispatchExecutor-managedThreadFactory-Thread-5] [timeMillis: 1526267128081] [levelValue: 900] [[ 未找到executionId: 306对应的任务实例状态]]
疑问
- __TimerPool连接池为何无法释放连接?
- 执行器服务为何运行缓慢?
针对疑问1:__TimerPool连接池无法释放连接的原因及解决办法
从报错里的javax.transaction.RollbackException能定位到核心问题在事务登记环节,结合CentOS 7和6的环境差异,主要有这几个诱因:
- 系统环境事务兼容性问题:CentOS 7的内核、系统依赖库和CentOS 6存在差异,Glassfish 4.1的JTS事务管理器在新环境下处理事务同步登记时触发异常,导致事务被提前标记为回滚状态。连接池尝试将连接登记到已回滚的事务时失败,最终无法正常回收连接,造成连接池耗尽。
- 内置连接池默认配置不足:
__TimerPool是Glassfish的系统内置连接池,默认的最大连接数、超时时间等配置在CentOS 7的高负载场景下不够用。一旦事务异常导致连接无法释放,池内可用连接会快速被占满。 - JBatch任务事务边界管理不当:如果Chunk型JBatch任务的reader/writer环节出现未捕获的异常,会触发事务回滚,但Glassfish连接池在这种异常场景下的连接回收逻辑没有正常工作。
解决建议:
- 调整
__TimerPool配置:在Glassfish管理控制台找到该连接池,增大最大连接数(比如从默认8调至32),设置合理的连接超时时间(30秒)和闲置超时时间(60秒),确保连接能被及时回收。 - 修复事务异常:检查JBatch任务代码,确保Chunk处理逻辑中捕获并处理异常,避免事务被意外标记回滚;同时在Glassfish事务配置里延长
transaction-timeout参数,防止任务处理超时触发事务回滚。 - 适配CentOS 7环境:给JVM添加
-Dcom.sun.jts.enableTCCL=true参数,解决事务管理器在新环境下的类加载问题;也可以更新Glassfish的相关依赖库,提升环境兼容性。
针对疑问2:执行器服务运行缓慢的原因及解决办法
执行器变慢是连接池耗尽引发的连锁反应,再结合环境差异还有这些细节:
- 当
__TimerPool连接被耗尽后,JBatch任务的执行线程会阻塞在获取连接的操作上,大量线程等待连接释放,直接导致任务执行效率急剧下降,表现为执行器运行缓慢。 - CentOS 7的CPU调度策略、内存管理机制和CentOS 6不同,如果Glassfish的
batchDispatchExecutor线程池配置没有适配新环境,会降低线程调度效率,进一步加剧执行缓慢的问题。
解决建议:
- 优先解决
__TimerPool的连接释放问题,这是执行缓慢的根源。 - 调整执行器线程池配置:在Glassfish中找到
concurrent/batchDispatchExecutor,根据服务器CPU核心数设置核心线程数和最大线程数(比如CPU核心数的2-4倍),确保线程调度能充分利用系统资源。 - 优化JVM参数:针对CentOS 7增大JVM堆内存(比如
-Xmx4g),改用G1垃圾收集器,减少GC停顿对任务执行的影响。
内容的提问来源于stack exchange,提问作者kosgeinsky
相关产品推荐
相关产品推荐

