tomcat 停止 java 线程不停止_Tomcat热部署,Web工程中线程没有终止

近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如下:org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed

看到该问题,一直认为是操作数据库的类没有事务声明,所以在类上加上@Transactional,但没生效。并且程序不定期的调用工程中的Runnable类,然后报以上错误。明明只有一个线程,却出现多个线程运行,猜想应该是之前热部署时,存储在静态资源中的定时线程没有清除。重启Tomcat,发现不会报错了。故定位为Tomcat热部署,静态资源为释放。

猜想:遗留线程未释放,仍在运行,此时操作数据库,出现创建事务失败的异常,应该是web工程热部署后,Spring的事务管理已失效,无法创建事务。

解决方法:

(1)使用Java EE5中的注解@PreDestroy

(2)使用Spring中的DisposableBean或配置destroy-method。(类实现 DisposableBean 接口,在 destroy() 方法中实现资源释放)

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值