作者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
1F:推 joetsai:感谢... 07/07 23:18
2F:→ joetsai:不过 考虑到 Sql Injection 改用 分段 Commit 有效吗? 07/07 23:20
3F:→ joetsai:或 不产生新的Statement 重复 setString Execute 这段 07/07 23:35
4F:→ joetsai:这样可以减少 Cursors 数吗? 07/07 23:43
5F:推 abcf:千万别把sql语法串成String字串 会死人的 07/12 00:35