精华内容
下载资源
问答
  • 主要介绍了Oracle出现超出打开游标最大数的解决方法,涉及针对Oracle游标位置的判断与处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 解决疑难问题,针对偏僻的问题:oracle超出打开游标最大数的原因和解决方案,希望能对大家操作数据库有用处
  • 转自:... 处理超出打开游标最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_open_cursors_exceeded_ 在执行如下代码时,经常会出现ora-01000: maximum

    转自:http://blog.csdn.net/kai27ks/article/details/7633482

    处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded

    ORA-01000_maximum_open_cursors_exceeded_

    在执行如下代码时,经常会出现ora-01000: maximum open cursors exceeded异常
    for(int i=0;i<balancelist.size();i++)
    {
         prepstmt = conn.prepareStatement(sql[i]);
         prepstmt.setBigDecimal(1,nb.getRealCost());
         prepstmt.setString(2, adclient_id);
         prepstmt.setString(3, daystr);
         prepstmt.setInt(4, ComStatic.portalId);
         prepstmt.executeUpdate();
    }

    1. 检查数据库中的 OPEN_CURSORS 参数值。
    Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为 50。要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询:   
    SQL> show parameter open_cursors;
    NAME                                  TYPE         VALUE
    ------------------------------------ ----------- ---------------
    open_cursors                          integer      300   


    修改open_cursors

    SQL> alter system set open_cursors=1000;

    系统已更改。

    SQL> commit;

    提交完成。

    SQL> show parameter open_cursors;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ---------------------
    open_cursors                         integer     1000


    重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值),也不会增加系统开销。
    2. 获取打开的游标数。
    下面的查询按降序显示用户SCOTT为每个会话打开的游标数。  
    SQL> select o.sid, osuser, machine, count(*) num_curs
       2   from v$open_cursor o, v$session s
       3   where user_name = 'SCOTT' and o.sid=s.sid
       4   group by o.sid, osuser, machine
       5 order by   num_curs desc;
        SID OSUSER        MACHINE            NUM_CURS
    -----------------------------------------------------
            217            m1                 1000
             96            m2                 10
            411            m3                 10
             50           test                 9
    请注意,v$open_cursor 可以跟踪会话中 PARSED  NOT CLOSED 的动态游标(使用 dbms_sql.open_cursor() 打开的游标)。它不会跟踪未经分析(但已打开)的动态游标。在应用程序中使用动态游标并不常见。本模式的前提是未使用动态游标。
    3. 获取为游标执行的 SQL
    使用在以上查询结果中找到的 SID 运行下面的查询:
    SQL> select q.sql_text
       2   from v$open_cursor o, v$sql q
       3   where q.hash_value=o.hash_value and o.sid = 217;
    SQL_TEXT
    select * from empdemo where empid='212'
    select * from empdemo where empid='321'
    select * from empdemo where empid='947'
    select * from empdemo where empid='527'
    ...
    结果将显示正在连接上执行的查询。它提供了一个入手点,让您可以反向跟踪到打开游标的来源。


    这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement() conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatementprepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
    一般来说,我们在写Java代码的时候,createStatementprepareStatement都应该要放在循环外面,而且使用了这些 Statment后,及时关闭。最好是在执行了一次executeQueryexecuteUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将StatementPreparedStatement关闭。
    对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本  实际上,代码中的隐患并没有解除。
    而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。
         如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
    但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报游标超出数据库允许的最大值的错误,导致程序无法正常访问数据库。
    正确的代码,如下所示:
    for(int i=0;i<balancelist.size();i++)
    {
         prepstmt = conn.prepareStatement(sql[i]);
         prepstmt.setBigDecimal(1,nb.getRealCost());
         prepstmt.setString(2, adclient_id);
         prepstmt.setString(3, daystr);
         prepstmt.setInt(4, ComStatic.portalId);
         prepstmt.executeUpdate();
       prepstmt.close();
    }
    在执行了一次executeQueryexecuteUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将StatementPreparedStatement关闭。


    展开全文
  • Java代码在执行conn.createStatement和conn.prepareStatement时候实际上...java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误ORA-01000: 超出打开游标最大数ORA-01000: 超出打开游标最大数 at orac...

    Java代码在执行conn.createStatement和conn.prepareStatement时候实际上都是相当和在数据库中打开了个cursor

    不要放在这两个方法不要放在循环中

     

    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    ORA-01000: 超出打开游标的最大数
    ORA-01000: 超出打开游标的最大数

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1031)
    at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1264)
    at com.eastmoney.hdfs.DBUtil.Execute(DBUtil.java:62)
    at com.eastmoney.hdfs.SyncJob.Paging(SyncJob.java:366)
    at com.eastmoney.hdfs.SyncJob.Import(SyncJob.java:312)
    at com.eastmoney.hdfs.SyncJob.main(SyncJob.java:499)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
    Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
    Caused by: java.lang.NullPointerException
    at com.eastmoney.hdfs.SyncJob.Import(SyncJob.java:315)
    at com.eastmoney.hdfs.SyncJob.main(SyncJob.java:499)
    ... 5 more

    转载于:https://www.cnblogs.com/qoyi/archive/2012/02/22/2363060.html

    展开全文
  • 1.1.1. 问题现象系统报‘超出游标最大数’错误vo.fa.pub.exp.FABusinessException: ORA-01000: 超出打开游标最大数1.1.2. 查找游标溢出的方法:-----按游标数排列sessionselect o.sid, osuser, machine, count(*) ...

    文章版权所有Jusin Hao(luckyfriends),支持原创,转载请注明。

    1.1.1. 问题现象

    系统报‘超出游标最大数’错误

    vo.fa.pub.exp.FABusinessException: ORA-01000: 超出打开游标的最大数

    1.1.2. 查找游标溢出的方法:

    -----按游标数排列session

    select o.sid, osuser, machine, count(*) num_curs

    from v$open_cursor o, v$session s

    where user_name = 'ZMSJ' and o.sid=s.sid

    group by o.sid, osuser, machine

    order by num_curs desc;

    ---查询游标数大于一定值(这里是65)的session

    select sid, osuser, machine, num_curs from (

    select o.sid, osuser, machine, count(*) num_curs

    from v$open_cursor o, v$session s

    where o.sid=s.sid

    group by o.sid, osuser, machine

    order by num_curs desc)

    where num_curs > '65'

    9e2eca5c63cb6fc8b929f5815fbd22bf.png

    ----1)查询指定sid的sql内容

    select q.sql_text

    from v$open_cursor o, v$sql q

    where q.hash_value=o.hash_value and o.sid = 146;

    ----2)查询指定sid的sql内容

    select q.sql_text,q.SQL_FULLTEXT,q.SQL_ID,v.SQL_HASH_VALUE,

    v.CLIENT_INFO,

    v.SQL_ADDRESS,

    v.MACHINE,

    v.TERMINAL

    from v$open_cursor o, v$sql q,v$session v

    where q.hash_value=o.hash_value

    AND q.ADDRESS = v.SQL_ADDRESS

    and v.sid = 40;

    24000bf07501dc80821dc6a252e5e523.png

    1.1.3. 问题解决:

    提交查出的sql及报错代码给研发,出具补丁

    展开全文
  • 第一步:核查Oracle数据库 的游标的最大数处理超出打开游标最大数异常(ORA-01000: maximum open cursors exceeded)ORA-01000_maximum_open_cursors_exceeded_在执行如下代码时,经常会出现ora-01000: maximum ...


    第一步:核查Oracle数据库 的游标的最大数



    处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded)

    ORA-01000_maximum_open_cursors_exceeded_

    在执行如下代码时,经常会出现ora-01000: maximum open cursors exceeded异常

      1 for(int i=0;i<balancelist.size();i++)
      2 {
      3 prepstmt = conn.prepareStatement(sql[i]);
      4 prepstmt.setBigDecimal(1,nb.getRealCost());
      5 prepstmt.setString(2, adclient_id);
      6 prepstmt.setString(3, daystr);
      7 prepstmt.setInt(4, ComStatic.portalId);
      8 prepstmt.executeUpdate();
      9 }

    1. 检查数据库中的 OPEN_CURSORS 参数值。
      1 --Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为 50。要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询:
      2 SQL> show parameter open_cursors;
      3 NAME TYPE VALUE
      4 ------------------------------------ ----------- ---------------
      5 open_cursors integer 300
      6 
      7 修改open_cursors
      8 
      9 SQL> alter system set open_cursors=1000;
     10 
     11 系统已更改。
     12 
     13 SQL> commit;
     14 
     15 提交完成。
     16 
     17 SQL> show parameter open_cursors;
     18 
     19 NAME TYPE VALUE
     20 ------------------------------------ ----------- ---------------------
     21 open_cursors integer 1000
     22 

    重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值),也不会增加系统开销。
    2. 获取打开的游标数。
    下面的查询按降序显示用户“SCOTT”为每个会话打开的游标数。

      1 SQL> select o.sid, osuser, machine, count(*) num_curs
      2 2 from v$open_cursor o, v$session s
      3 3 where user_name = 'SCOTT' and o.sid=s.sid
      4 4 group by o.sid, osuser, machine
      5 5 order by num_curs desc;
      6 SID OSUSER MACHINE NUM_CURS
      7 -----------------------------------------------------
      8 217 m1 1000
      9 96 m2 10
     10 411 m3 10
     11 50 test 9

    请注意,v$open_cursor 可以跟踪会话中 PARSED 和 NOT CLOSED 的动态游标(使用 dbms_sql.open_cursor() 打开的游标)。它不会跟踪未经分析(但已打开)的动态游标。在应用程序中使用动态游标并不常见。本模式的前提是未使用动态游标。
    3. 获取为游标执行的 SQL。
    使用在以上查询结果中找到的 SID 运行下面的查询:
      1 SQL> select q.sql_text
      2 2 from v$open_cursor o, v$sql q
      3 3 where q.hash_value=o.hash_value and o.sid = 217;
      4 SQL_TEXT
      5 select * from empdemo where empid='212'
      6 select * from empdemo where empid='321'
      7 select * from empdemo where empid='947'
      8 select * from empdemo where empid='527'
      9 ...

    结果将显示正在连接上执行的查询。它提供了一个入手点,让您可以反向跟踪到打开游标的来源。
    这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
    一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些 Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
    对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本 。 实际上,代码中的隐患并没有解除。
    而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。
    如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
    但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和 ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
    正确的代码,如下所示:
      1 for(int i=0;i<balancelist.size();i++)
      2 {
      3 prepstmt = conn.prepareStatement(sql[i]);
      4 prepstmt.setBigDecimal(1,nb.getRealCost());
      5 prepstmt.setString(2, adclient_id);
      6 prepstmt.setString(3, daystr);
      7 prepstmt.setInt(4, ComStatic.portalId);
      8 prepstmt.executeUpdate();
      9  prepstmt.close();
     10 }

    在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。














    ——————————————————————————————————————————————————————————————————————————————————————————

    转载于:https://www.cnblogs.com/ios9/p/8855868.html

    展开全文
  • 系统运行了一段时间报错:java.sql.SQLException: ORA-01000: 超出打开游标最大数 查看数据库当前的游标数配置slqplus:show parameter open_cursors; 查看游标使用情况: select o.sid, osuser, machine, count(*)...
  • oracle在批量操作的时候经常遇到这些错误,报错代码示例  for (int i=0;i  String sql = "insert into users(uname,passwd) VALUES(?,?)";  PreparedStatement ps = conn.prepareStatement(sql);
  • Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,假如你的createStatement和prepare...因为游标一直在不停的打开,而且没有关闭。
  • 1.查看游标最大数: show parameter open_cursors; 2.修改open_cursors alter system set open_cursors=1000; commit;
  • 症状:系统运行了一段时间报错:java.sql.SQLException: ORA-01000: 超出打开游标最大数step 1:查看数据库当前的游标数配置slqplus:show parameter open_cursors;step 2:查看游标使用情况:select o.sid, osuser, ...
  • ORA-01000: maximum open cursors exceeded(超出打开游标最大数)异常一般是因为没有正确关闭连接造成的,及时关闭Connection和Statement通常可以有效避免ORA-01000: maximum open cursors exceeded异常。...
  • 问题原因 rest接口编码缺陷导致 解决办法 查询数据库当前游标数是...若还是报错超出打开最大游标数,需要找出具体sql查看,然后转对应业务开发 查看游标使用情况: SELECT s.sid, s.serial#, s.username, a.val
  • ORA-01000: 超出打开游标最大数 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标最大数 ORA-01000: 超出打开游标最大数 2.解决方案 2.1 以系统管理员打开oracle连接 2.2 执行sql语句 alt
  • 今天在调试下面这段代码时总是出现“ora-01000 超出打开游标最大数”这个错误,上网查了一下,主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中...
  • 下面是其中一段代码,请大家帮我分析一下为什么一直抛出ORA-01000: 超出打开游标最大数异常。Connection con = null;//Statement stmt =null;PreparedStatement pstmt = null;ResultSet rstm = null;ResultSet rs ...
  • 在for循环中调用数据库插表语句,容易造成ORA-01000: 超出打开游标最大数的问题,主要原始是用CONNECTION 创建了 PREPAREDSTATEMENT ,用完了 PREPAREDSTATEMENT 后,没有关闭PREPAREDSTATEMENT,导致游标一直处于...
  • ORA-01000: 超出打开游标最大数(解决及原因) 还是 chongqingdaxue 缴费平台, 税票打印完毕, 上传到财务处时, 当税票数目较少时(10几张), 能正常上传; 当数目较大时(共408张), 就上传失败. 查看 ...
  • 偶尔会出现以下异常:ORA-01000: 超出打开游标最大数。网络搜索了一下,说是使用游标的时候没有关闭连接。尤其是在循环使用的时候,会出现问题。于是我检查了下我的代码,结构如下:/** 删除表主键* */public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,196
精华内容 1,678
关键字:

oracle超出打开游标的最大数