我有一个多线程应用程序,其中主线程创建一些线程并将它们交给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;
}
我还注意到,如果在发生错误时释放连接,则会释放游标。但是,我不想为每个新请求创建新连接,因为它会降低整个应用程序的速度。
感谢任何帮助。感谢
答案 0 :(得分:2)
那里几乎没有问题:
您没有关闭连接。关闭finally
上的连接。
您没有关闭rs或查询(+1 immibis)
您是否考虑过使用Spring jdbc模板? 还要检查连接池。他们是你的朋友。
答案 1 :(得分:1)
您需要关闭resultSet和准备好的语句。在你的代码中,它没有完成。最好的方法是在最后一个块中执行此操作,因此即使发生异常,resultSet也会正确关闭,或者如果使用java7,请使用try-with-resources