Java問題:Quartz,Hibernate,Spring,Tomcat中定時任務無故停止,沒有錯誤


最近在做一個java項目的時候遇到一個十分奇怪的問題,想到大家可能也會遇到這樣的問題,所以在此發出來,希望大家遇到的時候能夠快速解決!

直入主題

問題:使用quartz進行定時任務自動執行的時候,用到hibernate進行數據庫交互,Tomcat運行中,會遇到在某個訪問前后無故停止運行,之后的定時任務全部卡住!

 

問題解析:首先我從幾個方面考慮這個問題。

1、quartz配置問題。

2、數據庫連接超時。

3、Tomcat自動清理或者超時。

4、quartz線程死鎖或阻塞。

5、hibernate Session問題。

綜合考慮以上問題,一個一個考慮。首先,我的配置是沒有問題的,因為quartz的配置還是很清晰和簡單的,經過反復查看沒有問題。數據庫連接在我設置成1s周期的時候也是沒有問題的,同時也不會是第三個原因。由於我的quartz的線程設置都是使用默認的,而且我在線程列表中也看到,有10個線程,所以線程不夠用導致阻塞是不可能的。死鎖的問題我也不用考慮,因為每個任務都是單獨存在的,沒有關聯。那就剩最后一個原因了,說實話,最后一個原因是我沒辦法的時候才突然想到的,也是問題所在。

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> -->

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM