resultSet.next()做什么

时间:2015-02-26 13:10:00

标签: java oracle jdbc

我有一个简单的问题。如果我的过程返回500行,那么在第1行中我的结果集有500行。这意味着现在所有记录都存在于此结果集对象中。我是对的吗?

如果rs.next迭代需要时间,这意味着它与存储过程性能无关,因为我们已经在Java端获得了包含所有500条记录的结果集对象。我是对的吗?

rs = (ResultSet)callableStatement.getObject(1);
logger.debug("Iterating ResultSet Starts");
Bean bean = null;
while(rs.next()) {
    logger.debug(“some logic but commented to check performance”);     
}

2 个答案:

答案 0 :(得分:2)

CallableStatement和ResultSet都有一个提取大小,用于决定在迭代结果集时从游标中一次检索多少行。默认情况下,您没有获得所有500行,您获得的行数达到了驱动程序的提取大小。根据{{​​3}},Oracle的默认提取大小要低得多:

  

默认情况下,当Oracle JDBC执行查询时,它会从数据库游标一次接收10行结果集。这是默认的Oracle行预取值。您可以通过更改行预取值来更改每次访问数据库游标时检索的行数(有关详细信息,请参阅" Oracle行预取"

     

JDBC 2.0还允许您为查询指定每次数据库往返时获取的行数,此数字称为获取大小。在Oracle JDBC中,行预取值用作语句对象中的缺省提取大小。设置提取大小会覆盖row-prefetch设置,并影响通过该语句对象执行的后续查询。

     

获取大小也用于结果集。当语句对象执行查询时,语句对象的提取大小将传递给查询生成的结果集对象。但是,您还可以在结果集对象中设置提取大小,以覆盖传递给它的语句提取大小。 (另请注意,在生成结果集后对语句对象的提取大小所做的更改将不会影响该结果集。)

默认设置为10时,您的代码将进行50次往返以获取过程调用中的所有数据。 (这个文档已经很老了 - 它讨论的是JDBC 2.0,好像它是新的 - 所以它可能已经过时了,你应该检查你的fetch大小设置为什么。)按顺序更改获取大小一次性取回所有行应该可以最大限度地减少网络中的行程开销。

答案 1 :(得分:1)

  

这意味着现在所有记录都存在于此结果集对象中。我是对的吗?

通常这是不正确的。 ResultSet通常是数据库游标的抽象,当调用next时,它会根据需要获取结果集的记录。

只有在某些特殊情况下,您才能获得所谓的“客户端游标”,这意味着所有数据都已提前复制到您的身边。这是一种不合需要的行为,并且是JDBC规范要求数据库本身不支持的情况的解决方法。

相关问题