Java超过最大值的异常_java異常·超出打開游標最大值

分享一個最近在做項目時遇到的問題

190ac420cf31534ff3c6a9b11f8aaed7.png

也不是什么大問題,但是需要細心來解決,因為以后可能還會遇到所以寫一篇博客來記錄。

源錯誤代碼如下

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

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值