重用ResultSet

时间:2012-10-15 20:02:39

标签: 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){};

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

2 个答案:

答案 0 :(得分:14)

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

请查看: - ResultSet#close文档,其中包含: -

  

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

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

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

答案 1 :(得分:0)

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