Java JDBC Lazy-Loaded ResultSet

2022-09-01 10:50:57

有没有办法获取从运行JDBC查询中获得的结果集,以便延迟加载?我希望每一行都按照我的要求加载,而不是事先加载。


答案 1

简短的回答:

呼叫 前使用 。Statement.setFetchSize(1)executeQuery()

长答案:

在很大程度上取决于您使用的 JDBC 驱动程序。您可能想看看这个页面,它描述了MySQL,Oracle,SQL Server和DB2的行为。

主要要点:

  • 每个数据库(即每个 JDBC 驱动程序)都有自己的默认行为。
  • 有些司机会毫不掩饰地尊重,而另一些司机则需要一些“帮助”。setFetchSize()

MySQL是一个特别奇怪的案例。请参阅此文章。听起来好像如果你调用 ,那么它会一次下载一个行,但它并不完全清楚。setFetchSize(Integer.MIN_VALUE)

另一个例子:这是PostgreSQL行为的文档。如果启用了自动提交,则 ResultSet 将一次读取所有行,但如果关闭,则可以按预期使用。setFetchSize()

最后要记住的一件事是:这些 JDBC 驱动程序设置仅影响客户端上发生的情况。服务器可能仍将整个结果集加载到内存中,但您可以控制客户端下载结果的方式。


答案 2

难道不能通过将语句的提取大小设置为 1 来实现此目的吗?

如果一次只读取 1 行,则在 ResultSet 上调用 next() 之前不应加载每行。

例如:

Statement statement = connection.createStatement();
statement.setFetchSize(1);
ResultSet resultSet = statement.executeQuery("SELECT .....");
while (resultSet.next())
{
  // process results. each call to next() should fetch the next row
}

推荐