我需要连续运行多个查询
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没有正确关闭,还是在垃圾收集过程中隐含地完成了?
答案 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)只允许一个打开的连接。如果您对数据库访问有任何问题,请尝试使用。