如果你不使用連接池,那么就沒有什么問題,一旦Connection關閉,數據庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。
但是如果你使用連接池,那么請注意,Connection關閉并不是物理關閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,并且實際占用相關的數據庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數據庫允許的最大值”的錯誤,導致程序無法正常訪問數據庫。
---
這個關不關和使用不使用conn pool沒有關系,一般操作是會是這樣,線程從外界獲取一個conn,然后創建自己地stmt,rs,然后執行邏輯操作,然后將conn返回給pool。 如果程序員忘記手動關地話。當這個線程執行完以后,stmt,rs都成垃圾,當他們被垃圾搜集地時候,gc會替我們把它們給關閉地。這就是很多代碼沒有關閉,仍然正常運行。
但是這樣會有一個潛在地問題。就是gc無法確定什么時候運行。如果free地內存很多,很可能有些gc就不會被啟動,這樣stmt遲遲沒有被關閉,執行一段時間會報錯。
所以健壯地代碼應該手工把rs,stmt都關閉
---
Java連結Oracle常犯錯誤
1。只懂 createStatement,不懂關閉statement
2.。只懂 createStatement,不懂preparedStatement.
3 。只懂在sql里用to_date,甚至直接用String,不懂用 setDate()
---
我記得.我的程序中也出現過這種問題,
主要原因是我get Connection 對象后,這個connectin沒有被進行關閉,
同時進行出來的 preparedStatement 對象,不關閉也會出現這種問題,
而且,推薦這些數據庫操作的變量盡量用局部變量,現用現取,隨時關閉,而且放在finally{}中進行關閉,比較保險
---
通常這樣的情形是你使用了超過DB設定同時可用的connection數量
你可以試試看下列方式:
1. 若你使用connection pool, 你可以將connection pool的max connection
數量降低看看, 同時檢查有無歸還connection
2. 若未使用conneciton pool, 你就該檢查一下, 你的connection在使用過後
有沒有關閉囉
另外一種情形是: 你的系統使用量真的很大, 所以同時150的DB connection
session是不夠的, 你就需要調整Oracle DB囉