1. 程式人生 > >使用JDBC後千萬記得關閉並釋放資料庫連線資源

使用JDBC後千萬記得關閉並釋放資料庫連線資源

原文地址:http://www.wangzhongyuan.com/archives/231.html

在我10月30日的一篇文章《使用JDBC後記得關閉並釋放資料庫連線資源噢:)》中,提到JDBC中的Mysql資料庫連線Connection和Statement、Resultset使用完畢之後一定要關閉,否則會佔用大量記憶體資源,導致記憶體溢位。為了驗證連線關閉是否確實能夠釋放資源,我做了一個小實驗。一個小的資料庫連線、查詢、插入的程式,測試記錄為8萬條。

(1)整個程式建立了一個Connection的物件conn,然後每次執行完資料庫操作(查詢、插入等),都關閉Statement s以及Resultset rs: s.close();rs.close()。
執行程式前,有大約1.3G空閒記憶體:

Mem: 92M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1329M Free

開始執行程式的時候,空閒記憶體減少了12M,但是之後就非常穩定,程式對記憶體的需求一直都穩定在12M左右:

Mem: 104M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1317M Free

程式停止以後,空閒記憶體又恢復到原來的水平:

Mem: 92M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1329M Free

(2)整個程式建立了一個Connection的物件conn,然後每次執行完資料庫操作(查詢、插入等),都關閉Resultset rs: rs.close(),但沒有關閉Statement s物件。
執行程式前,有大約1.3G空閒記憶體:

Mem: 92M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1329M Free

開始執行程式後,記憶體剩餘空間持續直線下降,空閒記憶體最低達到以下情況:

Mem: 92M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1281M Free

程式執行完以後,空閒記憶體又恢復到原來的水平:

Mem: 92M Active, 29M Inact, 42M Wired, 88K Cache, 32M Buf, 1329M Free

對實驗現象以及原因的小結:
對於上面的第二個實驗,可以想象,如果資料量更多的話,程式對記憶體的需求就會不斷增加,直至把記憶體都“吃完”,最後記憶體溢位,程式終止。

因此,在不使用資料庫連線池的時候,在不產生衝突的前提下,Connection物件可以使用同一個conn,在操作資料庫的時候Statement物件如果只有建立但沒有關閉,則程式對記憶體的消耗會不斷增加直到記憶體溢位或者程式執行完畢(gc或者Driver Vendor會自動回收statement和resultset)。所以當要長時間執行資料庫連線操作的時候,一個良好的習慣是Statement s以及Resultset rs使用之後一定要關閉(如果是使用連線池的時候,這樣做也是很有好處的)。