Java + Oracle ORA-1000超出了最大打开游标数

时间:2014-08-07 08:18:28

标签: java sql multithreading oracle concurrency

我有一个多线程应用程序,其中主线程创建一些线程并将它们交给ExecutorService。所有线程都使用主类中的Oracle数据库连接对象。数据库连接打开一次,其他线程中的所有方法都使用主数据库对象。

然而,一旦应用程序开始运行并处理记录,我看到游标打开的数量一直在增加,直到2000年(我在Oracle中设置了这个限制)然后导致ORA-1000消息,直到我才消失重启应用程序。我正在关闭所有方法和语句的结果集,我无法弄清楚为什么游标数不会减少(即使我运行单个线程)

这是一种方法:

private boolean GetPending()
{
    try {
        String statement = "SELECT * FROM PENDING_REQUESTS WHERE REQUEST_ID = GET_PENDING()";
        PreparedStatement query = DbConnection.prepareStatement(statement);
        ResultSet rs = query.executeQuery();
        while (rs.next()) {
            MSISDN = rs.getInt(3);
            SHORTCODE = rs.getInt(4);
            MESSAGE = rs.getString(5);
            return true;
        }
        rs.close();
        query.close();
    }
    catch(SQLException e) {
        LogWriter.Log("ID:"+ID+"\t\tError returning field: " + e.toString());
    }
    return false;   
}

我还注意到,如果在发生错误时释放连接,则会释放游标。但是,我不想为每个新请求创建新连接,因为它会降低整个应用程序的速度。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

那里几乎没有问题:

您没有关闭连接。关闭finally上的连接。

您没有关闭rs或查询(+1 immibis)

您是否考虑过使用Spring jdbc模板? 还要检查连接池。他们是你的朋友。

答案 1 :(得分:1)

您需要关闭resultSet和准备好的语句。在你的代码中,它没有完成。最好的方法是在最后一个块中执行此操作,因此即使发生异常,resultSet也会正确关闭,或者如果使用java7,请使用try-with-resources