java异常·超出打开游标最大值
来源:互联网 发布:灵犀一动知乎 编辑:程序博客网 时间:2024/06/10 21:37
分享一个最近在做项目时遇到的问题
也不是什么大问题,但是需要细心来解决,因为以后可能还会遇到所以写一篇博客来记录。
源错误代码如下
`import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestJava{
private static Connection conn;
private static PreparedStatement pst;
public static void main(String[] args) {
try {
//反射获得驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//连接服务器
conn = DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:XE”, “hongli”, “hongli”);
//sql命令
String sql = “insert into t_detail_31(aaa_login_name,login_ip,nas_ip,time_duration) values (?,?,?,?)”;
//填入数据 for(int i=0;i<10000;i++){ //预编译 pst = conn.prepareStatement(sql); pst.setString(1, "hongli"); pst.setString(2, "232,23.234"); pst.setString(3, "sf.s3.43"); pst.setInt(4, i); pst.executeUpdate(); } } catch (ClassNotFoundException e) { System.out.println("驱动文件未找到"); e.printStackTrace(); } catch (SQLException e) { System.out.println("sql连接异常"); e.printStackTrace(); }finally{ try { if(pst!=null) pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
}`
然后就发生了错误,经过一番检查发现异常出现在第301个数据。前三百个数据都能插入,但是第301个数据的时候就会报错,这是为什么呢?是因为在java代码中,执行statement的时候,实际上是在在数据库中打开了一个cursor(游标-游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果)。如果你的Statement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
目前想到的解决方案有两个:
1、在for循环以前创建一个statement,但有一个问题,万一下次数据没有完全覆盖了本次数据,那么就会造成数据的混乱,so不建议。
2、每次for循环开始创建一个statement,每次for循环结束时,关闭。
于是代码就变成了如下:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class TestJava{ private static Connection conn; private static PreparedStatement pst; public static void main(String[] args) { try { //反射获得驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //连接服务器 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "hongli", "hongli"); //sql命令 String sql = "insert into t_detail_31(aaa_login_name,login_ip,nas_ip,time_duration) values (?,?,?,?)"; //填入数据 for(int i=0;i<10000;i++){ //预编译 pst = conn.prepareStatement(sql); pst.setString(1, "hongli"); pst.setString(2, "232,23.234"); pst.setString(3, "sf.s3.43"); pst.setInt(4, i); pst.executeUpdate(); try { if(pst!=null) pst.close(); } catch (SQLException e) { e.printStackTrace(); } } } catch (ClassNotFoundException e) { System.out.println("驱动文件未找到"); e.printStackTrace(); } catch (SQLException e) { System.out.println("sql连接异常"); e.printStackTrace(); } }}
- java异常·超出打开游标最大值
- Java Oracle JDBC 超出打开游标的最大数异常
- 超出打开游标的最大数异常
- Java-超出打开游标的最大数
- Oracle 游标数超出最大值
- 处理超出打开游标的最大数异常
- 处理超出打开游标的最大数异常
- 【Oracle异常】ORA-01000: 超出打开游标的最大数
- 处理超出打开游标的最大数异常
- 超出打开游标的最大数异常的解决
- 处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded)
- 处理超出打开游标的最大数异常(ORA-01000: maximum open cursor )
- 超出打开游标的最大数 问题
- oracle 超出打开游标的最大数
- 超出打开游标的最大数
- java.sql.SQLException: ORA-01000: 超出打开游标的最大数
- java.sql.SQLException: ORA-01000: 超出打开游标的最大数
- java.sql.SQLException: ORA-01000: 超出打开游标的最大数
- Python OpenCV获取视频
- 深入理解MyBatis(六)—MyBatis的缓存机制
- HDU6170 Two strings(动态规划)
- Gradle学习系列之十——自定义Plugin
- C++对象切割
- java异常·超出打开游标最大值
- 推送
- 阶乘
- 1. Two Sum
- 数据库总结之字段语法
- CCF-201409-1-相邻数对
- 04-面向对象
- 软考之探路:规划
- hello