作者pico2k (風月)
站內java
標題Re: [問題] PreparedStatement 與 Cursor 的關係
時間Thu Jul 7 23:03:49 2011
※ 引述《joetsai (路人酒菜)》之銘言:
: Method 如下:
: public void insert(Connection i_conn) throws Exception {
: PreparedStatement ps = null;
: String strSql = " insert into table1 ( id ) values ( ? ) ";
: try {
: ps = i_conn.prepareStatement(strSql);
: ps.setString(1, getId());
: ps.executeUpdate();
: } finally {
: try {
: ps.close();
: } catch (Exception e) {
: }
: }
: }
: 從外部傳入 Connection 重複執行 insert 8000 次 做完後在外部一起Commit
: 偶爾會出現 Maximum open cursors exceeded (ORA-01000) 的錯誤
: DB 是 Oracle 10g 預設 Cursor 是 300個
: 請問是因為 一個 prepareStatement 產生一個 Cursor 嗎?
: 可是程式有進行close 是因為產生的來不及關閉嗎?
: 還是我的觀念錯誤!?
: 謝謝~~~
你的問題的確是因為Cursors有時來不及關閉,所以偶爾會產生這個錯誤。
建議改用Statement,而且只用一個Statement物件來執行原本的動作,
然後,使用Statement物件所提供的execute函數,
把要執行的SQL語法串成一個String物件,
當成參數傳至execute函數,
你一定會發現Java VM的記憶體使用量突然變的好低,
你知道的,
記憶體的使用量最好跟V領一樣,
越低越好。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.64.95
推 joetsai:感謝... 07/07 23:18
→ joetsai:不過 考慮到 Sql Injection 改用 分段 Commit 有效嗎? 07/07 23:20
→ joetsai:或 不產生新的Statement 重複 setString Execute 這段 07/07 23:35
→ joetsai:這樣可以減少 Cursors 數嗎? 07/07 23:43
推 abcf:千萬別把sql語法串成String字串 會死人的 07/12 00:35