2012-04-02 51 views
6

根据java.sql.StatementdocumentationgetResultSet,它说:的getResultSet()“应该被称为每个结果只有一次”

检索当前结果作为ResultSet对象。每个结果只能调用一次该方法 。

使用一些测试代码,我跑executeQuery()并多次打电话给getResultSet()并观察返回的ResultSet指向同一个对象。所以我猜测它不会返回一个不同的ResultSet,你需要单独关闭它。但是,这当然可以是我的JDBC驱动程序独有的。

纵观documentationResultSet它说:

默认的ResultSet对象不可更新,并具有游标 向前移动而已。因此,只能从第一行到最后一行遍历一次,并且只能遍历一次。

这似乎是一个很好的理由,因为它可能导致一些“陷阱”的情况多次调用它可能不是一个好主意。如果这是唯一的原因,我觉得他们可能只是说,所以我认为可能比这更多。

因此,有谁知道为什么每个结果不应该多次调用getResultSet?这question是让我好奇的第一个地方。

+1

没有发布这个答案,因为它只是一个预感,但我怀疑这是给JDBC驱动程序开发人员留有余地的方法,使他们无法定义当你多次调用它时会发生什么。在你的特定情况下,它可以工作,但如果你曾经切换JDBC驱动程序,它可能不会。 – 2012-04-02 22:19:06

+1

我认为它就像这样简单:ResultSet对象具有状态。只有一个ResultSet对象作为Statement的成员。获取对象不会重新执行语句。如果您在第一次获得后修改了某些内容,则无法保证第二次获取对象与第一次获取对象的状态相同。所以这只是一个谨慎。查看Postres jdbc驱动程序(org.postgresql.jdbc2.AbstractJdbc2Statement),我们可以看到它在内部使得许多调用像这样:return(result!= null && result.getResultSet()!= null); – Glenn 2012-04-03 01:08:13

回答

4

ResultSet对象是由Java JDBC提供的接口 - 它们不提供实现。即使您的特定数据库代码和相关驱动程序实施了ResultSet,因此您可以在每个结果上多次调用它,如果您依赖于合同外的这种行为,那么您当然在玩火。

与合同编写this method should be called only once per result系列的一个可能原因是出于效率原因。构建ResultSet很可能会对数据库进行JDBC RPC调用,并且JDBC规范的作者希望阻止多次往返。他们可能不希望强制执行者有效地防止每个结果多次调用。再说一次,即使你的数据库正在防范这种行为,但并不意味着下一次会有这种行为。

大多数ResultSet实现也保持与数据库打开的连接,以便当您获得某些字段(如大块)时,它可以回调数据库以获取数据。使用多个对象的相同连接打开或(更糟糕)多个连接将非常危险/令人困惑。

此外,他们可能一直担心代码的两部分调用getResultSet()两次,并返回对同一个单一非同步对象的引用。这会在调用next()时引起混淆,并用多个引用覆盖该对象。

我在猜测当然,但我希望这有助于。

+0

绝对有帮助!如果我没有记错,关闭“ResultSet”不会关闭任何可能创建的斑点。关于多连接的第三段我有点困惑。 ResultSet'不会使用相同的'Connection'从数据库中检索任何数据吗?另外,我不清楚为什么来自多个ResultSet的'Connection'是不好的 - 我敢肯定,我忽略了一些明显的东西。另外,如果你可以提供一个例子(即使它是针对特定的JDBC驱动程序的)调用getResult两次的问题,我认为这将是一个完美的答案。 – nevets1219 2012-04-03 21:41:31

+0

重新第三段,我只是说连接管理是一个问题。如果有多个Connection对象的副本,或者如果两个线程都有一个ResultSet并且正在对同一个非同步的Connection执行操作,那就很危险。 – Gray 2012-04-03 21:46:08

+0

举例来说,我没有时间。这是关于违反合同的。 Postgres可能会升级他们的驱动程序并稍微改变行为,但仍然履行合同,并且如果您要依靠多个调用工作,代码将会中断。这是一个原则问题。 – Gray 2012-04-03 21:47:29

相关问题