環境:SQL Server 2000 ,Java7u55,TomCat
這幾天在做Ajax過程中,發現了一個很嚴重的問題,
一個頁面上,有三處get請求,在運行時經常隨機出現各jdbc錯誤:
驅動中報異常:
1.空指針
2.結果集已關閉
3.socket closed
4....
5.很多種,想不起來了,
反正各種異常,問題是有一半的時間它是好用的,同一個頁面有時又不好用了.最怕的就是這種現象啊,
解決過程:
1.由於SQL Server2000較老,懷疑是驅動問題,換了驅動,無果
2.懷疑連接打開太慢,加了c3p0連接池後,問題依舊
3.加入了各種調試語句,沒有發現空指針的地方.
問題進入僵局.
看着自己寫的Dao工具類,邏輯上沒有發現不正確的地方,就是個簡單的Jdbc調用過程.
但想到出現問題主要是在一個頁面中有多次請求時,在一次請求的情況下並不出錯,所以懷疑是併發方面的問題
突然想到自己爲了偷懶,把工具類的執行方法寫成了靜態方法,把connection與ResultSet等數據庫對象都寫成了Static,
那麼在快速的兩次執行時,第二次在第一次沒有結束時就開始執行,會不會是第二次與第一次干擾了呢,?
想到這裏,我把Dao中數據庫的cn和rs對象的Static去掉,把Dao類每次執行Sql語句時都New一下,問題解決
問題代碼如下:
ResultSet rs=DaoDs.runSelect(sql, p);
//...使用Rs工作
DaoDs.close();//關閉相關對象
Dao工具類:cn,rs都是static的
public static ResultSet runSelect(String sql,Object ... p) throws Exception
{
try {
Class.forName(driver);
cn = DriverManager.getConnection(url, user, password);
ps = cn.prepareStatement(sql);
int i = 1;
if (p != null)
for (Object t : p) {
if (t == null)
break;
ps.setObject(i, t);
i++;
}
rs = ps.executeQuery();
return rs;
} catch (Exception e) {
// e.printStackTrace();
throw e;
// return null;
} finally {
}
}
修改後:Dao類中cn,rs不再是static,Dao工具類先new再用.
DaoDs2 d=new DaoDs2();
ResultSet rs=d.runSelect(sql, p);
//...使用Rs工作
d.close();
看來不能亂偷懶啊!