在java應用中,我們會經常用oracle jdbc.在開發中我們有時候會遇到(ORA-01000: maximum open cursors
exceeded)的錯誤。在ITPUB上juant曾發過一篇帖子:http://www.itpub.net/showthread.php?
s=&threadid=122832&perpage=15&pagenumber=1
[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只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。
對這個問題專門研究了一下,并寫了測試程序,首先說一些測試環境,我們的數據庫最大可打開的cursor設置為600,操
作的數據庫表的記錄數為30條記錄。為了模擬同時打開600cursor,也就是說有600個statement在運行,必須用到java
的多線程。下面是測試程序:
public class StatementTest extends Thread{
private Connection conn;
public StatementTest(Connection conn) {
this.conn = conn;
start();
}
public void run(){
try {
String strSQL = "SELECT * FROM TestTable"
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(strSQL);
int i = 0;
while(rs.next()){
System.out.println("----"+i+"------");
i = i+1;
}
rs.close();
stmt.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void main(String args[]){
try{
Connection conn = DBConnection.getConnection();
for(int i = 0;i < 800;i++){
new StatementTest(conn);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
本Blog純屬個人學習、工作需要,記錄相關資料。請不要發表任何有人身攻擊的言論,謝謝! www.zhipsoft.cn
posted on 2007-07-31 15:12
ZhipSoft 閱讀(1351)
評論(0) 編輯 收藏 所屬分類:
DataBase