根据getResultSet
中java.sql.Statement
的{{3}},它说:
以ResultSet对象的形式检索当前结果。这个方法应该 每个结果只能被调用一次。
使用一些测试代码,我运行executeQuery()
并多次调用getResultSet()
并观察到返回的ResultSet
指向同一个对象。所以我猜它没有返回你需要单独关闭的不同ResultSet
。但当然这对我的JDBC驱动程序来说可能是独一无二的。
查看ResultSet
的{{3}},它说:
默认的ResultSet对象不可更新,并且有一个游标 只向前迈进。因此,您只需迭代一次即可 仅从第一行到最后一行。
这似乎是一个很好的理由,为什么多次调用它可能不是一个好主意,因为它可能导致一些“陷阱”情况。如果这是唯一的原因,我觉得他们可能刚刚说过,所以我认为可能还有更多不仅仅是这个。
所以有人知道为什么每个结果不应该多次调用getResultSet
?这documentation首先使我感到好奇。
答案 0 :(得分:4)
ResultSet
对象是Java JDBC提供的接口 - 它们不提供实现。即使您的特定数据库代码和相关驱动程序实现ResultSet
,以便您可以每次结果多次调用它,如果您依赖于合同之外的此类行为,那么您肯定在玩火了。
合同是用this method should be called only once per result
行编写的一个可能原因是出于效率原因。构建ResultSet很可能会对数据库进行JDBC RPC调用,而JDBC规范的作者则希望阻止多次往返。他们可能不想强迫实施者有效地防止每个结果多次调用。同样,即使您的数据库正在防范该行为,也不代表下一个行为。
大多数ResultSet
实现还保持与数据库的连接打开,这样当您获得某些字段(例如大blob)时,它可以回调数据库以获取数据。打开多个连接或(更糟)使用来自多个ResultSet
对象的相同连接会非常危险/混乱。
此外,他们可能一直担心代码的两个部分调用getResultSet()
两次,并返回对同一个未同步对象的引用。这会在调用next()
时引起混淆,并用多个引用覆盖对象。
我当然在猜测,但我希望这会有所帮助。