4

我需要连续运行几个查询

Statement st = cnx.createStatement();
ResultSet rs = st.executeQuery( "SELECT [good stuff]");
// do something smart with rs
rs = st.execute( "SELECT [better stuff]");
// do something smarter with rs
rs = st.execute( "SELECT [best stuff]");
// you got it
try{ rs.close();} catch( SQLException ignore){};
try{ st.close();} catch( SQLException ignore){};

这是前两个 ResultSet 没有正确关闭的问题,还是在垃圾收集期间隐式完成的?

4

2 回答 2

18

执行第二个查询后,前一个查询ResultSet会自动关闭。就这Garbage Collection一点而言,您不必担心。你可以只stmt.close()在最后有一个。它会自动关闭所有相关的ResultSet对象。

看一下:-ResultSet#close文档,其中说:-

当 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,生成它的 Statement 对象会自动关闭 ResultSet 对象。

如果您想测试结果集是否关闭,您可以使用 while 循环在result setwhile 循环内部迭代,创建另一个查询并将其分配给相同的结果集。你会看到一个异常会被抛出..

ResultSet res = stmt.executeQuery("SELECT * FROM sometable");

while (res.next()) {
    res.getString(1);

    // Closes the previous `ResultSet`
    res = stmt.executeQuery("SELECT * FROM othertable");
} 

所以,在上面的代码中,在第二次迭代中,你会得到一个Exception: - Cannot perform operation after ResultSet is closed

于 2012-10-15T20:04:08.360 回答
0

我不知道您的问题是什么,但是如果您在运行此代码时遇到问题,您可以尝试关闭连接并打开其他连接以进行第二次查询。一些数据库产品,比如 SQLite,只允许一个打开的连接。如果您对数据库访问有任何问题,您应该尝试一下。

于 2012-10-15T20:24:06.887 回答