在運行一個java應用時,發現出現如下錯誤。
org.logicalcobwebs.proxool.HouseKeeper sweep
警告: #0002 was active for 634297 milliseconds and has been removed automaticaly. The Thread responsible was named 'http-8080-1', but the last SQL it performed is unknown because the trace property is not enabled.
相應出錯代碼:
try {<br /> conn = connect();<br /> stmt = conn.createStatement();<br /> rs = stmt.executeQuery(sql);<br /> while (rs.next()) { //報錯地方<br /> to = rs.getString("EmailTo").trim();<br /> body = rs.getString("EmailBody");<br /> subject = rs.getString("EmailSubject");<br /> from = rs.getString("EmailFrom").trim();<br /> cc = rs.getString("EmailCC").trim();<br /> send(subject, body, to, cc, bcc, from, au))<br /> }<br />} catch (SQLException e) {<br /> ErrorLog.log("get send message exception./n" + e.getMessage(),logfile);<br /> //throw e;<br />} finally {<br /> close(rs, stmt, conn);<br />}
分析:
根據提示,程式中的資料庫連接沒有釋放。由此想到可能在執行sql前有connection沒有釋放。檢查,程式中擷取並使用connection的地方病不多,檢查後發現沒有問題。同時也沒有出現一個connection過多的進行擷取getConnect()。
繼續關注輸出資訊,發現rs.next()行出錯,但並不是每行都出錯。而是在迴圈到第7條左右時才發生異常。難道是連線逾時了?檢查設定檔,連線逾時時間是5秒,和迴圈7次用時基本相當。將逾時時間設大,出錯的發生的時間依次延遲了。設定為足夠迴圈完成的時間。異常消失。
原因:
connection為及時關閉。不過這是一個表面的原因。深層次的原因是
proxool中配置的maximum-active-time不僅對於閒置connection生效,而且對於處於活動的connection同樣生效。這樣可能將活動中的connection強制關閉。
解決:
該類問題需要從這幾個方面檢查:
1, 是否有connection在使用完後未及時關閉。
2, 對於一個connection是否多次的進行了getConnection()操作。
3, 檢查報錯地方的connection的生存期其執行時間和proxool設定檔中的maximum-active-time值的差異。適當增大該值。如果一個connection的操作過程中耗費時間較長,可以通過臨時變數來縮短connection的操作時間。如上例,可以定義string數組來存放,而後在用迴圈來處理這些string。