项目背景:elastic job(底层是quartz)
由于esjob中是通过新建线程来执行任务的,所以不能加载为spring bean,因此任务内部通过实现ApplicationContextAware的方式来获取spring bean,问题就出现在这里了
1.png
这个任务每分钟跑一次,然后发现数据库连接池中的逻辑开启越来越多,逻辑关闭远小于逻辑开启,一段时间后就无连接可用了,很明显该现象是因为连接没有关闭,连接没有关闭是因为事务没有提交,但一直以来都是这样使用的,不需要手动提交,为什么这里会出问题呢?怀疑是数据库问题(虽然可能性不大),查看后mysql是自动提交的,然后又看了下druid连接池,也是自动提交的,那为什么这里的事务不提交呢 - -
看了半天后才发现,tmd我没有用到事务啊,之前的方法都是@Transactional管理的,方法开始前会开启事务,结束后会commit或rollback,连接关闭,所以赶紧地把任务抽取成独立方法,加上注解,问题解决
网友评论