昨天在開發過程中,經常碰到ORA-01000: maximum open cursors exceeded這個錯誤。一看報錯,知道是游標超過最大數了,以前在做DB2開發的時候,也曾遇到過類似的問題。雖然解決了,但一直沒弄清楚,JDBC是如何和數據庫發生交互的?又是在什么時候打開數據庫游標的?腦袋就跟漿糊一樣,說來真是慚愧啊
昨天google了一把,終于解開一點迷惑了。
下面的片斷轉載于www.itpub.net
[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只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。
我昨天犯的錯誤就是把創建statement放到了循環之內,結果導致cursor猛增,到達了數據庫設置的最大數。
雖然解決了問題,也清楚了游標是何時創建的,但還有幾個問題比較迷糊。
1、通過查詢,JDBC是將所有的查詢結果一次性放到ResultSet中,還是一次只放一定數目的記錄?例如,查詢結果為2000條數據,JDBC是一次性將2000條數據放到結果集中,還是分批放置呢?
2、當通過ResultSet.next(),移動結果集指針時,此時是否還與數據庫發生交互?