Java问题:Quartz,Hibernate,Spring,Tomcat中定时任务无端中止,没有错误

最近在作一个java项目的时候遇到一个十分奇怪的问题,想到你们可能也会遇到这样的问题,因此在此发出来,但愿你们遇到的时候可以快速解决!java

直入主题数据库

问题:使用quartz进行定时任务自动执行的时候,用到hibernate进行数据库交互,Tomcat运行中,会遇到在某个访问先后无端中止运行,以后的定时任务所有卡住!缓存

 

问题解析:首先我从几个方面考虑这个问题。session

一、quartz配置问题。spa

二、数据库链接超时。hibernate

三、Tomcat自动清理或者超时。线程

四、quartz线程死锁或阻塞。code

五、hibernate Session问题。blog

综合考虑以上问题,一个一个考虑。首先,个人配置是没有问题的,由于quartz的配置仍是很清晰和简单的,通过反复查看没有问题。数据库链接在我设置成1s周期的时候也是没有问题的,同时也不会是第三个缘由。因为个人quartz的线程设置都是使用默认的,并且我在线程列表中也看到,有10个线程,因此线程不够用致使阻塞是不可能的。死锁的问题我也不用考虑,由于每一个任务都是单独存在的,没有关联。那就剩最后一个缘由了,说实话,最后一个缘由是我没办法的时候才忽然想到的,也是问题所在。rem

hibernate有本身的链接池,在使用的时候咱们新建的全部链接都会存在这个链接池中,若是你所建的新链接太多而不释放,那么就会致使你的新链接没法建立,从而阻塞,这也是为何程序中无端中止,并且没i有任何错误的缘由。

那么怎么解决这个问题呢,使用Hibernate时,你们通常都记住了配置基本的那些选项,好比方言,缓存等,可是有一项配置卻很容易忘掉,这就是链接释放模式:hibernate.connection.release_mode

这个配置项有三个选择:after_statement/after_transaction/on_close,javadoc中能够看出它们的用处,注意的一点是,若是不配置,默认是on_close,那么若是沒有显示的去调用session.close或其它关闭链接的方法的话,这个链接时不会被关闭的!在用到链接池的時候,就更会出现问题了,池中的链接会一直存在着而不会被关闭和回收!

具体的配置:<prop key="hibernate.connection.release_mode">after_transaction</prop>

放在你的hibernate配置里面就能够了。这样咱们的链接自动释放后就不会出现上述问题了。

PS:这个问题我解决了很长时间,网上的资料查了不少,浪费了不少时间,同时也有人遇到这样的问题,可是解决方式都不太对症。最后发现了这个问题。终于解决了,写在这里,方便你们。尽可能不要在这个问题上浪费时间。

若是帮助到了你,请点赞,谢谢!

 2015 12 16 

今天又深刻的研究了一下,问题的源头是链接池链接阻塞,因此我修改了数据源的链接回收时间,实验有效。具体配置以下,你们能够试试

        <!-- 初始链接数目 -->
        <property name="initialSize" value="10"></property>
        <!-- 最大链接数目 -->
        <property name="maxActive" value="50"></property>
        <!-- 最大空闲链接数目 -->
        <property name="maxIdle" value="50"></property>
        <!-- 最小空闲链接数目 -->
        <property name="minIdle" value="0"></property>
        <!-- 超时等待时间以毫秒为单位 -->
        <property name="maxWait" value="10000"></property>
        <!-- #是否自动回收超时链接 -->
        <property name="removeAbandoned" value="true"></property>
        <!-- #设置被遗弃的链接的超时的时间(以秒数为单位),即当一个链接被遗弃的时间超过设置的时间,则它会自动转换成可利用的链接。默认的超时时间是300秒。 -->
        <property name="removeAbandonedTimeout" value="60"></property>
        <!-- #是否在自动回收超时链接的时候打印链接的超时错误 -->
        <!-- <property name="logAbandoned" value="true"></property> -->
相关文章
相关标签/搜索