java.sql.SQLException: ORA-01000: maximum open cursors exceeded

来源:互联网 发布:淘宝怎么选择代收点 编辑:程序博客网 时间:2024/05/22 14:26

 

我使用Oracle数据库的时候,碰到有ORA-01000: maximum open cursors exceeded.的错误。

 

 

[INFO ] [2009-03-04 05:25:06] -=> [前向包月] DBAssist.UpdateDealState() count =0
[ERROR] [2009-03-04 05:25:06] -=> [updateDealState] 更新数据出错.
java.sql.SQLException: ORA-01000: maximum open cursors exceeded

        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java(Compiled Code))
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java(Compiled Code))
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java(Inlined Compiled Code))
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java(Compiled Code))
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java(Compiled Code))
        at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java(Compiled Code))
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java(Compiled Code))
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java(Compiled Code))
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java(Compiled Code))
        at weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java(Compiled Code))
        at com.linkage.iboss.thread.pmbs.DBAssist.UpdateDealState(DBAssist.java(Compiled Code))
        at com.linkage.iboss.thread.pmbs.PMBSUploadProcessor.writeAndUploadFile(PMBSUploadProcessor.java(Compiled Code))
        at com.linkage.iboss.thread.pmbs.PMBSUploadProcessor.process(PMBSUploadProcessor.java:110)
        at com.linkage.util.thread.MULTIDoJobThd.runWork(Unknown Source)
        at com.linkage.util.thread.CommonTHD.run(Unknown Source)



实际上,这个错误的原因,主要还是代码问题引起的。
ora-01000: maximum open cursors exceeded.
表示已经达到一个进程打开的最大游标数。

这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。

对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。
而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

oracle 9i 默认的open_cursors=300 

原创粉丝点击