Dao工具類能寫成static方式嗎?反覆不定時出現"結果集關閉"或"空指針"問題的解決

環境: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(); 

看來不能亂偷懶啊!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章