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