Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC延迟加载结果集_Java_Jdbc_Lazy Loading_Resultset - Fatal编程技术网

Java JDBC延迟加载结果集

Java JDBC延迟加载结果集,java,jdbc,lazy-loading,resultset,Java,Jdbc,Lazy Loading,Resultset,有没有一种方法可以获得通过运行JDBC查询获得的结果集,以便延迟加载?我希望每一行都按照我的要求加载,而不是事先加载。我认为您需要做的是推迟实际加载结果集本身。您需要手动实现该功能。您会发现使用该功能会容易得多。如果您直接使用jdbc,您基本上必须自己动手 hibernate中的抓取策略是高度可配置的,并且很可能会提供您甚至不知道的性能选项。您能否通过将语句的抓取大小设置为1来实现这一点 如果一次只提取一行,则在调用ResultSet上的next()之前,不应加载每一行 e、 g 简短答复: 调

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

我认为您需要做的是推迟实际加载结果集本身。您需要手动实现该功能。

您会发现使用该功能会容易得多。如果您直接使用jdbc,您基本上必须自己动手


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

您能否通过将语句的抓取大小设置为1来实现这一点

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

e、 g

简短答复: 调用
executeQuery()
之前,请使用
语句。setFetchSize(1)

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

主要外卖:

  • 每个数据库(即每个JDBC驱动程序)都有自己的默认行为
  • 一些驱动程序将尊重
    setFetchSize()
    ,而没有任何警告,而其他驱动程序则需要一些“帮助”
MySQL是一个特别奇怪的例子。看见听起来,如果调用
setFetchSize(Integer.MIN\u VALUE)
,它会一次下载一行,但并不完全清楚

另一个例子:对于PostgreSQL行为。如果启用了“自动提交”,则结果集将一次获取所有行,但如果禁用,则可以按预期使用
setFetchSize()


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

提供了答案

引述:

Presto JDBC驱动程序从不在内存中缓冲整个结果集。服务器API将在每个请求中向驱动程序返回最多1MB的数据。驱动程序将不会从服务器请求更多数据,直到数据被使用为止(通过对ResultSet调用适当次数的
next()
方法)

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


您能描述一下如何执行此操作吗?这只适用于顺序迭代,不允许提取初始语句范围之外的数据。但这是一个在普通情况下使用的好建议。在不了解您试图解决的问题的更多信息的情况下,我可能会做一个全面的概括,但如果驱动程序实现确实对每一行执行远程调用,那么这对于潜在的性能问题来说听起来相当奇怪(正如下面答案中指出的,情况未必如此)。其含义是,您不能依赖于每次调用ResultSet.next()检索到的一行因此,imho,这可能不是您试图解决的问题的解决方案。嗨,尼克。谢谢您的评论。我试图重新表述答案,以解释理论上的setFetchSize()答案是,但同样,这取决于您使用的是哪个数据库。例如,如果OP使用Oracle,这可能是正确的答案。我认为否决票是因为它没有回答问题,而不是因为建议本身是错误的。Hibernate通过给您一个列表,实际上正好相反。
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
}