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();        }    }}