java异常·超出打开游标最大值

分享一个最近在做项目时遇到的问题超出打开游标的最大数
也不是什么大问题,但是需要细心来解决,因为以后可能还会遇到所以写一篇博客来记录。
源错误代码如下
`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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值