Java结果集未正确关闭
我有一个Java应用程序,其中包含许多代码片段,如下面的示例所示。非常简单的Oracle数据库查询。返回并解析有效数据,然后调用close()函数Java结果集未正确关闭,java,plsql,try-catch,resultset,database-cursor,Java,Plsql,Try Catch,Resultset,Database Cursor,我有一个Java应用程序,其中包含许多代码片段,如下面的示例所示。非常简单的Oracle数据库查询。返回并解析有效数据,然后调用close()函数 ResultSet rs = null; Statement stmt = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM example"); while (rs.next()) { /
ResultSet rs = null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM example");
while (rs.next())
{
// do stuff
}
rs.close();
stmt.close();
System.out.println("test1");
}
catch (Exception e)
{
System.out.println("error1");
}
我开始遇到“超过最大游标数”错误。我检查了我的方法以确定结果集是否未关闭。catch
子句从未触发,每次都打印“test1”。这意味着不会跳过rs.close()和stmt.close()行。然而结果集实际上并没有被关闭
我添加了一个finally
子句,它解决了这个问题
finally
{
if (rs != null)
{
try
{
rs.close();
System.out.println("test2");
}
catch (Exception e)
{
System.out.println("error2");
}
}
if (stmt != null)
{
try
{
stmt.close();
System.out.println("test3");
}
catch (Exception e)
{
System.out.println("error3");
}
}
}
输出:
test1
test2
test3
我的问题是,为什么需要调用rs.close()和stmt.close()两次?try
子句中的调用似乎不起任何作用。然而,我在finally
子句中再次调用了它们,它们成功了。这怎么可能呢?使用(Java 7+):
不,不需要打两次电话
不,JDBC中不需要调用两次close
。我怀疑发生了什么事
我们无法确切地告诉您的代码中发生了什么。我们不知道你所谓的第二个电话是否真的解决了这个问题。例如,文件中说:
对已关闭的语句对象调用close方法无效
利用资源进行尝试
正如建议的那样,您应该尝试使用资源
见:
- 试着利用资源
- 若要尝试使用资源,请使用try with Resource语句中先前创建的变量
中放置一个或多个资源,然后尝试(…)
。用分号分隔,最后一个分号是可选的。Java将采取跟踪资源的方法,每个资源都按与打开相反的顺序关闭。如果中间出现异常,java知道不尝试关闭空资源对象。这大大简化了编码
try (Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery("SELECT * FROM example")) {
while (rs.next()) {
// do stuff
}
System.out.println("test1");
}
} catch (Exception e) {
System.out.println("error1");
}