java.sql.SQLException: ORA-01000: 超出打开游标的最大数 解决方法

java.sql.SQLException: ORA-01000: 超出打开游标的最大数 解决方法


先看有问题的代码 
查看复制到剪切板打印

  1. import java.sql.Connection;   
  2. import java.sql.DriverManager;   
  3. import java.sql.SQLException;   
  4. import java.sql.Statement;   
  5.   
  6. public class Test {   
  7.   public Connection getConnection() {   
  8.      String url = "jdbc:oracle:thin:@localhost:1521:ora9i";   
  9.      String user = "scott";   
  10.      String password = "tiger";   
  11.      Connection con = null;   
  12.     try {   
  13.        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   
  14.        con = DriverManager.getConnection(url, user, password);   
  15.      } catch (Exception e) {   
  16.        e.printStackTrace();   
  17.      }   
  18.     return con;   
  19.    }   
  20.   
  21.   public static void main(String[] args) throws SQLException {   
  22.     long a = 13819100000L;   
  23.     long b = 13819100600L; // 问题点   
  24.      Connection con = null;   
  25.      Statement stmt = null;   
  26.      Test insert = new Test();   
  27.     try {   
  28.        con = insert.getConnection();   
  29.       for (long c = a; c <= b; c++) {   
  30.          String sql = "insert into telepnum values(" + c + ")";   
  31.          stmt = con.createStatement(); // 这里是问题的所在   
  32.          stmt.executeUpdate(sql);   
  33.        }   
  34.        System.out.println("OK");   
  35.      } catch (Exception e) {   
  36.        e.printStackTrace();   
  37.      } finally {   
  38.       if (con != null) {   
  39.          con.close();   
  40.        }   
  41.      }   
  42.    }   
  43. }  
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class Test { public Connection getConnection() { String url = "jdbc:oracle:thin:@localhost:1521:ora9i"; String user = "scott" String password = "tiger"; Connection con = null; try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); con = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return con; } public static void main(String[] args) throws SQLException { long a = 13819100000L; long b = 13819100600L; // 问题点 Connection con = null; Statement stmt = null; Test insert = new Test(); try { con = insert.getConnection(); for (long c = a; c <= b; c++) { String sql = "insert into telepnum values(" + c + ")"; stmt = con.createStatement(); // 这里是问题的所在 stmt.executeUpdate(sql); } System.out.println("OK"); } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) { con.close(); } } }}

分析 
在循环里面每次都 
stmt = con.createStatement(); 
而没有释放,这样每个都占用了一个服务器的游标资源,最后造成失败 

解决方案 
1 增加关闭语句 
查看 复制到剪切板 打印
  1. con = insert.getConnection();   
  2. for (long c = a; c <= b; c++) {   
  3.    String sql = "insert into telepnum values(" + c + ")";   
  4.    stmt = con.createStatement(); // 这里是问题的所在   
  5.    stmt.executeUpdate(sql);   
  6.    stmt.close(); // 用完了就关闭好了   
  7. }  
con = insert.getConnection(); for (long c = a; c <= b; c++) { String sql = "insert into telepnum values(" + c + ")"; stmt = con.createStatement(); // 这里是问题的所在 stmt.executeUpdate(sql); stmt.close(); // 用完了就关闭好了 }
2 将这句话移动到循环外面,推荐用这个 
查看 复制到剪切板 打印
  1. con = insert.getConnection();   
  2. stmt = con.createStatement(); // 移动到这里,Statemet是可以重用的   
  3. for (long c = a; c <= b; c++) {   
  4.    String sql = "insert into telepnum values(" + c + ")";   
  5.    stmt.executeUpdate(sql);   
  6. }   
  7. stmt.close(); // 用完了就关闭好了  
con = insert.getConnection(); stmt = con.createStatement(); // 移动到这里,Statemet是可以重用的 for (long c = a; c <= b; c++) { String sql = "insert into telepnum values(" + c + ")"; stmt.executeUpdate(sql); } stmt.close(); // 用完了就关闭好了

3 改装成批量更新 
查看 复制到剪切板 打印
  1. con = insert.getConnection();   
  2. con.setAutoCommit(false);   
  3. stmt = con.createStatement(); // 移动到这里,Statemet是可以重用的   
  4. for (long c = a; c <= b; c++) {   
  5.    String sql = "insert into telepnum values(" + c + ")";   
  6.    stmt.addBatch(sql);   
  7. }   
  8. stmt.executeBatch();   
  9. con.commit();  
con = insert.getConnection(); con.setAutoCommit(false); stmt = con.createStatement(); // 移动到这里,Statemet是可以重用的 for (long c = a; c <= b; c++) { String sql = "insert into telepnum values(" + c + ")"; stmt.addBatch(sql); } stmt.executeBatch(); con.commit();

就这么多了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.sql.SQLException: ORA-01109: 数据库未打开ORA-01109是一个Oracle数据库错误代码,表示数据库无法在当前状态下打开。这个错误通常发生在以下几种情况下: 1. 数据库实例并未启动: 在使用Java连接Oracle数据库时,首先需要确保数据库实例已经启动。如果数据库实例没有运行,则会导致ORA-01109错误。请检查数据库实例是否已经启动,并尝试重新连接。 2. 数据库正在进行恢复操作: 如果数据库正在进行恢复操作,那么在恢复操作完成之前是无法打开数据库的。请等待数据库恢复完成后再进行连接。 3. 数据库文件损坏: 可能由于文件系统错误或其他原因,数据库文件损坏导致无法打开数据库。在这种情况下,可能需要使用Oracle数据库的恢复工具来修复数据库文件。 4. 数据库处于不可恢复的状态: 如果数据库处于不可恢复的状态,那么无法打开数据库。可能需要进行数据库的恢复操作来解决此问题。 解决该问题的方法包括: 1. 确保数据库实例已经启动。 2. 确保数据库没有进行恢复操作,并等待恢复操作完成。 3. 检查数据库文件是否损坏,并通过数据库恢复工具修复损坏的文件。 4. 如果数据库处于不可恢复的状态,可以尝试进行数据库的恢复操作。 总之,ORA-01109错误是表示数据库无法在当前状态下打开的错误。要解决这个问题,需要检查数据库实例状态,修复可能的文件损坏,并确保数据库处于可恢复的状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值