最近一個項目測試時經常出這個錯,應該是jdbc問題,但不是連接未關閉導致達到最大連接數,因爲這是oracle數據庫報錯,說明已經連上數據庫,估計是某些程序中statement未關閉。以下是網絡上關于這個問題的帖子:
[TIP]關于Java開發中使用Oracle數據庫的一點注意事項(轉貼)
很多朋友在Java開發中,使用Oracle數據庫的時候,經常會碰到有
ORA-01000: maximum open cursors exceeded.的錯誤。
實際上,這個錯誤的原因,主要還是代碼問題引起的。
ora-01000: maximum open cursors exceeded.
表示已經達到一個進程打開的最大遊標數。
這樣的錯誤很容易出現在Java代碼中的主要原因是:Java代碼在執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環裏面的話,就會非常容易出現這個問題。因爲遊標一直在不停的打開,而且沒有關閉。
一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應該要放在循環外面,而且使用了這些Statment後,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之後,如果不需要使用結果集(ResultSet)的數據,就馬上將Statment關閉。
對于出現ORA-01000錯誤這種情況,單純的加大open_cursors並不是好辦法,那只是治標不治本。實際上,代碼中的隱患並沒有解除。
而且,絕大部分情況下,open_cursors只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。
---
如果你不使用連接池,那麽就沒有什麽問題,一旦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()
- Nov 10 Fri 2006 14:53
ORA-00020: maximum number of processes (150) exceeded
ORA-00020: maximum number of processes (150) exceeded
全站熱搜
留言列表
發表留言