当前位置: 首页 > 面试题库 >

重用ResultSet

马高谊
2023-03-14
问题内容

我需要连续运行几个查询

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未正确关闭的问题还是在垃圾回收期间隐式完成?


问题答案:

一旦执行第二个查询,上一个查询ResultSet就会自动关闭。就Garbage Collection您而言,您不必担心。最后,您可以仅stmt.close()此而已。它将自动关闭所有相关ResultSet对象。

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

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

如果要测试是否关闭结果集,则可以使用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



 类似资料:
  • 问题内容: 我在我们的代码库上运行了findbugs,它指出还有两个语句仍需要关闭。在代码的这一部分中,我们运行: 3个不同的查询,重用prepareStatement。在finally块中,我们确实关闭了资源: 应该在下一个连接之前关闭该语句。prepareStatement(query); 还是这个findbug谨慎? 问题答案: 是的,在执行下一个connection.prepareStat

  • 问题内容: 我正在开发一个API,其中包含许多相同名称的方法,只是签名不同而已,这在我看来是很普遍的。它们都做相同的事情,不同之处在于,如果用户不想指定默认值,则它们会默认初始化各种值。作为一个容易理解的例子,考虑 所有这些方法执行的基本动作是相同的;森林里种了一棵树。我的API用户需要了解许多重要事项,以了解如何为所有这些方法添加树。 理想情况下,我想编写一个Javadoc块,供所有方法使用:

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: mysql中id(auto_increment列)的碎片 我的数据库中有此列。假设其名称为“ threadid”。它包含赋予每个线程以区别的唯一ID。 线程号9 8 7 6 5 4 3 2 1 假设我已删除ID为5和6的线程。 线程号9 8 7 4 3 2 1 但是,当删除后有一个提交时,给该线程的唯一ID是10。不是5。我认为

  • 我想打印友元重载运算符中的向量值 课堂在这里: 但是当我调用main方法时,它不会编译 这是因为接线员 错误:错误:运算符不匹配 我不想使用for运算符进行迭代,我正在寻找一个智能的解决方案,即复制ostream中的向量内容?

  • 在RxJava中,我有一个对象,其中我订阅了。稍后(在调用后的一段时间)我创建了一个新的并使用之前使用的相同实例进行订阅。但是,这似乎不起作用。订阅者不能重用吗? 示例: 在我的代码中,我想实例化一次,并多次调用,例如在用户单击刷新按钮后...

  • 现在,如果变量'a'在每次执行中都不同,Threadpool以后真的可以重用它吗?我无法真正理解这将如何工作,但我从未见过“ThreadPool重用线程,除了...”,因此产生了困惑。