重用的ResultSet(Reusing ResultSet)

2019-09-24 03:21发布

我需要连续运行几个查询

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中没有正确关闭或它的垃圾收集过程中隐含做了什么?

Answer 1:

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

看看: - ResultSet#close的文档,它说: -

一个结果对象被生成它当Statement对象被关闭时,重新执行,或用于检索从多个结果序列中的下一结果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");
} 

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



Answer 2:

我不知道什么是你的问题,但如果你有一些问题,运行这段代码,你可以尝试关闭连接,并打开其他使第二查询。 有些数据库产品,如SQLite的,只承认一个打开的连接。 如果你有一个数据库访问的任何问题,你应该尝试的。



文章来源: Reusing ResultSet