简析关于定时任务跑着跑着就停止了的问题

前两天项目中遇到个问题,用定时任务每隔30秒去下载图片到本地,定时任务跑十几次之后就停止了。

用的是 spring内部自带的task任务调度, 一般来说定时任务突然停止有以下几方面的原因:

一是定时任务的配置问题,只配了多久发生一次和发生时执行的方法,所以这个原因排除。

二是数据库连接超时,因为连接超时会有异常提示信息,并没有这个原因也排除了。

三是线程死锁或阻塞,当时觉得就是这个原因了,然后关掉了其他的定时任务,然后看了下线程列表,发现线程

死锁导致阻塞也是不可能的。

最后实在是没办法了,把定时任务的方法,和它调用的方法的每个分支都加了日志打印出来,发现每次跪的地都是

从sqlserver数据库里取数据的时候 ,由于日志较多看了好久,分析了几次才发现这个问题。比较尴尬,查了资料

发现

因为hibernate是有自己的连接池在使用的时候我们新建的所有连接都会存在这个连接池中,如果建的新连接

太多而不释放,那么就会导致新连接无法创建,从而阻塞,这也就是定时任务跑着跑着突然停止的原因。

这就需要在hibernate的配置中增加连接释放模式:hibernate.connection.release_mode

记忆里从来没有配置过这个东西,如果不配置,默认是on_close,

这个配置项有三个选择:after_statement/after_transaction/on_close,javadoc中可以看出它们的用处,

那么如果沒有显示的去调用session.close或其它关闭连接的方法的话,这个连接时不会被关闭

的!在用到连接池的時候,就更会出现问题了,池中的连接会一直存在着而不会被关闭和回收!

具体的配置:after_transaction

放在你的hibernate配置里面就可以了。这样我们的连接自动释放后就不会出现上述问题了。

网上还找到了一个原因说是tomcat自动清理或超时,因为问题解决了就没有去尝试。百度了下说是涉及到真死和

假死,要去抓个dump分析,希望之后有机会去尝试。






你可能感兴趣的:(数据库)