重用ResultSet

Mon*_*ded 3 java sql jdbc resultset

我需要连续运行几个查询

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){};
Run Code Online (Sandbox Code Playgroud)

这是一个问题,前两个ResultSet没有正确关闭,还是在垃圾收集过程中隐含地完成了?

Roh*_*ain 16

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

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

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

如果要测试结果集是否关闭,可以使用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");
} 
Run Code Online (Sandbox Code Playgroud)

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

  • @RohitJain:不,这不是它的工作原理。在“while (res.next())”中,“next”会在“res”*当前*引用的任何“ResultSet”上调用。 (2认同)