在用原生JDBC 循环插入数据 如果数据量超过数据库游标会提示 java.sql.SQLException: ORA-01000: 超出打开游标的最大数
在这种情况下游标不停的打开而没有关闭,当循环次数足够大时就会出现上面的错误。
解决方法:
1、增大游标的数量(不可取)
分析:
1.1、显然这种方法治标不治本,游标的数量往往设置一个 较小值即可,除非特殊情况;
1.2、应用程序不同,该值也不同
1.3、并么有根除代码上的缺陷
(解决操作)
该方法通过修改数据库默认游标大小 数据库默认游标为300
以 DBA 登录 PL/SQL(或者用dba给改用户(实例)授权)
grant dba to jw_api;--给当前用户授dba权
revoke dba from jw_api--给当前用户取消dba权限
打开 Command Window(注意不是 SQL Window)
查询当前用户最大的游标数
show parameter open_cursors;
输入以下命令, 修改 oracle 最大游标数为 1000
alter
system
set
open_cursors=1000 scope=both;
修改完可以看下是否修改成功
2、修改代码
分析:
Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor,
当PreparedStatement或statement执行操作之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
尤其是在循环中,因为游标一直在不停的打开,而且没有关闭;
综上所述:上面的代码在pstmt.execute();之后执行pstmt.close();方法即可
con.setAutoCommit(false);
true
:sql命令的提交(commit)由驱动程序负责false
:sql命令的提交由应用程序负责,程序必须调用commit或者rollback方法
设置了该参数 即在整个事务执行完了才去提交。
测试发现con.commit();不写也会提交事务