做程序離不開連接數據庫,所以一些打開,關閉數據庫是經常要執行的操作,打開數據庫后,在程序用完后要及時關閉數據庫連接資源,以釋放內存,避免資源耗盡.但現在有一個問題,即當我們關閉了
Connection對象后,
Statement,ResultSet對象是否會自動關閉問題,對于這個問題,之前我在網上也找了相關資料,說會自動關閉,所以一段時間以來,我都是只關閉
Connection對象,而沒有關閉
Statement,ResultSet對象,但程序也能正常運行,程序也沒有因為資源耗盡而崩潰,對于這一點,其實是有原因的:
1)首先,關閉了
Connection對象后,是不會自動關閉
Statement,ResultSet對象的:

try
{
Connection con = null;
Statement st = null;
ResultSet rs = null;
con = getConnection();
st = con.createStatement();
rs = st.executeQuery(sql);
}

catch(Exception e)
{
System.out.println("ocurr error
");
}

finally
{
con.close();con=null;

try
{
con.close();
}

catch(SQLException se)
{
System.out.println("ocurr close error
");
}
}

System.out.println("statement object:"+st);
System.out.println("resultset object:"+rs);

上面的代碼先獲取了連接,然后只關閉了
Connection對象,而沒有關閉
Statement,ResultSet對象,最后兩行代碼輸出
Statement,ResultSet對象,是有結果的,表明關閉了Connection對象,而沒有關閉Statement,ResultSet對象.
2)Statement對象將由Java垃圾收集程序自動關閉,而作為一種好的編程風格,應在不需要Statement對象時顯式地關閉它們,這將立即釋放DBMS資源,有助于避免潛在的內存問題.
3)ResultSet維護指向其當前數據行的光標.每調用一次next方法,光標向下移動一行.最初它位于第一行之前,因此第一次調用next將把光標置于第一行上,使它成為當前行.隨著每次調用next導致光標向下移動一行.按照從上至下的次序獲取ResultSet行,在ResultSet對象或其父輩Statement對象關閉之前,光標一直保持有效.
所以在打開數據庫資源后,盡量手工關閉Connection對象和Statement,ResultSet對象,要養成一種良好的編程風格.
注:他們三者之間關閉沒有任何關聯,即先關閉誰沒有任何先后順序,可以先關閉他們中的任何一個,且關閉其中的任何一個對象都不會關閉其他其他對象,但一般養成按關閉ResultSet,Statement,Connection的順序關閉資源.
posted on 2008-06-06 11:02
henry1451 閱讀(6752)
評論(6) 編輯 收藏 所屬分類:
Java技術