JDBC批量插入提示ORA-01000: 超出打开游标的最大数(解决及原因)

在用原生JDBC 循环插入数据  如果数据量超过数据库游标会提示 java.sql.SQLException: ORA-01000: 超出打开游标的最大数 

JDBC批量插入提示ORA-01000: 超出打开游标的最大数(解决及原因)_第1张图片 

 

在这种情况下游标不停的打开而没有关闭,当循环次数足够大时就会出现上面的错误。

JDBC批量插入提示ORA-01000: 超出打开游标的最大数(解决及原因)_第2张图片

解决方法:
   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();方法即可

JDBC批量插入提示ORA-01000: 超出打开游标的最大数(解决及原因)_第3张图片 

con.setAutoCommit(false);

true:sql命令的提交(commit)由驱动程序负责
false:sql命令的提交由应用程序负责,程序必须调用commit或者rollback方法

设置了该参数 即在整个事务执行完了才去提交。

测试发现con.commit();不写也会提交事务 

 

你可能感兴趣的:(Java,Oracle,PLSQL)