`

ORA-01000: maximum open cursors exceeded

阅读更多

ORA-01000: maximum open cursors exceeded

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

 

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)

    at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120)

    at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:586)

    at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:385)

    at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:413)

    at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:119)

    at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:92)

    at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:950)

    at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:802)

    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)

    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)

    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)

    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)

    at org.hibernate.loader.Loader.doQuery(Loader.java:673)

    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)

    at org.hibernate.loader.Loader.doList(Loader.java:2220)

    ... 45 more

 

 

 

解决方案:

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

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


我就是在循环里调用con.prepareStatement(sql)导致的这个错误。

修改方法,

在遍历完ResutSet后关闭rsstmt就可以了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics