在運(yùn)行一個java應(yīng)用時,發(fā)現(xiàn)出現(xiàn)如下錯誤。
org.logicalcobwebs.proxool.HouseKeeper sweep
警告: #0002 was activefor 634297 milliseconds and has been removed automaticaly. The Threadresponsible was named 'http-8080-1', but the last SQL it performed isunknown because the trace property is not enabled.
相應(yīng)出錯代碼:
分析:
根據(jù)提示,程序中的數(shù)據(jù)庫連接沒有釋放。由此想到可能在執(zhí)行sql前有connection沒有釋放。檢查,程序中獲取并使用connection的地方病不多,檢查后發(fā)現(xiàn)沒有問題。同時也沒有出現(xiàn)一個connection過多的進(jìn)行獲取getConnect()。
繼續(xù)關(guān)注輸出信息,發(fā)現(xiàn)rs.next()行出錯,但并不是每行都出錯。而是在循環(huán)到第7條左右時才發(fā)生異常。難道是連接超時了?檢查配置文件,連接超時時間是5秒,和循環(huán)7次用時基本相當(dāng)。將超時時間設(shè)大,出錯的發(fā)生的時間依次推遲了。設(shè)置為足夠循環(huán)完成的時間。異常消失。
原因:
connection為及時關(guān)閉。不過這是一個表面的原因。深層次的原因是
proxool中配置的maximum-active-time不僅對于空閑的connection生效,而且對于處于活動的connection同樣生效。這樣可能將活動中的connection強(qiáng)制關(guān)閉。
解決:
該類問題需要從這幾個方面檢查:
1, 是否有connection在使用完后未及時關(guān)閉。
2, 對于一個connection是否多次的進(jìn)行了getConnection()操作。
3,檢查報(bào)錯地方的connection的生存期其執(zhí)行時間和proxool配置文件中的maximum-active-time值的差異。適當(dāng)增大該值。如果一個connection的操作過程中耗費(fèi)時間較長,可以通過臨時變量來縮短connection的操作時間。如上例,可以定義string數(shù)組來存放,而后在用循環(huán)來處理這些string。