【討論】JDBC中,如果ResultSet 和 Statement 不關閉的話,會有什么影響
感覺上好象是只要把connection給關閉了,系統(tǒng)就能正常運行了。
那在查詢或是其實操作中,如果只關閉Connection,不作ResultSet 和 Statement 的關閉的話,對系統(tǒng)性能是否會有影響呢。或者是其實方面的不良影響。
如果你不使用連接池,那么就沒有什么問題,一旦Connection關閉,數(shù)據(jù)庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。
但是如果你使用連接池,那么請注意,Connection關閉并不是物理關閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,并且實際占用相關的數(shù)據(jù)庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數(shù)據(jù)庫允許的最大值”的錯誤,導致程序無法正常訪問數(shù)據(jù)庫。
補充:其實這個要看你用的是什么數(shù)據(jù)庫,然后決定了你的JDBC,然后呢,決定了實現(xiàn)這個JDBC的方法,然后呢就決定了問題。
建議關閉。
不使用連接池的情況下,如果你直接關閉連接話,對應的Statement,ResultSet對象都應該由Driver Vendor來幫你關閉,即由他來進行資源的釋放.這個是由JDBC3.0規(guī)范中提到的.因為有些數(shù)據(jù)庫資源可能屬于GC不能釋放的范圍.
對于連接池的實現(xiàn)而言,有時間我看看Oracle和Postgres的實現(xiàn)再下定論吧.但是我認為出現(xiàn)上面的情況應該理解成為連接池vendor的一種沒有按規(guī)范來實現(xiàn)的問題.如果用數(shù)據(jù)庫自己實現(xiàn)的連接池應該不會有這樣的情況出現(xiàn).
使用連接池時也應該會關閉PreparedStatement和ResultSet,看過Apache的DBCP,它是會關的,不知道其他連接池是怎么樣的。實際上,使用不使用連接池應該對開發(fā)者透明,都應該遵循Jdbc規(guī)范,從這個角度,連接池如果沒有實現(xiàn)關閉功能應該是有問題的。
那在查詢或是其實操作中,如果只關閉Connection,不作ResultSet 和 Statement 的關閉的話,對系統(tǒng)性能是否會有影響呢。或者是其實方面的不良影響。
如果你不使用連接池,那么就沒有什么問題,一旦Connection關閉,數(shù)據(jù)庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。
但是如果你使用連接池,那么請注意,Connection關閉并不是物理關閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,并且實際占用相關的數(shù)據(jù)庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數(shù)據(jù)庫允許的最大值”的錯誤,導致程序無法正常訪問數(shù)據(jù)庫。
補充:其實這個要看你用的是什么數(shù)據(jù)庫,然后決定了你的JDBC,然后呢,決定了實現(xiàn)這個JDBC的方法,然后呢就決定了問題。
建議關閉。
不使用連接池的情況下,如果你直接關閉連接話,對應的Statement,ResultSet對象都應該由Driver Vendor來幫你關閉,即由他來進行資源的釋放.這個是由JDBC3.0規(guī)范中提到的.因為有些數(shù)據(jù)庫資源可能屬于GC不能釋放的范圍.
對于連接池的實現(xiàn)而言,有時間我看看Oracle和Postgres的實現(xiàn)再下定論吧.但是我認為出現(xiàn)上面的情況應該理解成為連接池vendor的一種沒有按規(guī)范來實現(xiàn)的問題.如果用數(shù)據(jù)庫自己實現(xiàn)的連接池應該不會有這樣的情況出現(xiàn).
使用連接池時也應該會關閉PreparedStatement和ResultSet,看過Apache的DBCP,它是會關的,不知道其他連接池是怎么樣的。實際上,使用不使用連接池應該對開發(fā)者透明,都應該遵循Jdbc規(guī)范,從這個角度,連接池如果沒有實現(xiàn)關閉功能應該是有問題的。
posted on 2005-03-05 23:10 辰 閱讀(1795) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫相關