Re: [問題] PreparedStatement 與 Cursor 的關係

看板java作者 (風月)時間13年前 (2011/07/07 23:03), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

07/07 23:18, , 1F
感謝...
07/07 23:18, 1F

07/07 23:20, , 2F
不過 考慮到 Sql Injection 改用 分段 Commit 有效嗎?
07/07 23:20, 2F

07/07 23:35, , 3F
或 不產生新的Statement 重複 setString Execute 這段
07/07 23:35, 3F

07/07 23:43, , 4F
這樣可以減少 Cursors 數嗎?
07/07 23:43, 4F

07/12 00:35, , 5F
千萬別把sql語法串成String字串 會死人的
07/12 00:35, 5F
文章代碼(AID): #1E5ShN4w (java)
文章代碼(AID): #1E5ShN4w (java)