繁体   English   中英

Java JDBC Lazy-Loaded ResultSet

[英]Java JDBC Lazy-Loaded ResultSet

有没有办法获得从运行JDBC查询获得的ResultSet来延迟加载? 我希望每行都按照我的要求加载,而不是事先加载。

简短回答:

在调用executeQuery()之前使用Statement.setFetchSize(1) executeQuery()

答案很长:

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

主要外卖:

  • 每个数据库(即每个JDBC驱动程序)都有自己的默认行为。
  • 一些驱动程序会尊重setFetchSize()而没有任何警告,而其他驱动程序则需要一些“帮助”。

MySQL是一个特别奇怪的案例。 看到这篇文章 听起来如果你调用setFetchSize(Integer.MIN_VALUE) ,它会一次下载一行,但它并不是很清楚。

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

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

您是否可以通过将Statement的获取大小设置为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
}

提供了一种答案在这里

引用:

Presto JDBC驱动程序永远不会将整个结果集缓冲在内存中。 服务器API将根据请求向驱动程序返回最多约1MB的数据。 在消耗该数据之前,驱动程序不会从服务器请求更多数据(通过在ResultSet上调用next()方法适当的次数)。

由于服务器API的工作方式,忽略了驱动程序获取大小(根据JDBC规范,它只是一个提示)。

证明忽略了setFetchSize

我想你想要做的是推迟实际加载ResultSet本身。 您需要手动实现它。

你会发现这很容易使用休眠 如果你直接使用jdbc,你基本上必须自己滚动。

休眠中的提取策略是高度可配置的,并且很可能提供您甚至不知道的性能选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM