gpt4 book ai didi

java - Statement.setFetchSize(nSize) 方法在 SQL Server JDBC 驱动程序中的真正作用是什么?

转载 作者:IT老高 更新时间:2023-10-28 20:29:47 26 4
gpt4 key购买 nike

我有一张非常大的表,每天有几百万条记录,每天结束时,我都会提取前一天的所有记录。我这样做是这样的:

String SQL =  "select col1, col2, coln from mytable where timecol = yesterday";
Statement.executeQuery(SQL);

问题是这个程序需要大约 2GB 的内存,因为它将所有结果都存储在内存中,然后再对其进行处理。

我尝试设置 Statement.setFetchSize(10) 但它从操作系统中获取完全相同的内存,它没有任何区别。为此,我正在使用 Microsoft SQL Server 2005 JDBC 驱动程序

有没有办法像 Oracle 数据库驱动程序在执行查询以仅显示几行并且向下滚动时显示更多结果时那样以小块读取结果?

最佳答案

在 JDBC 中,setFetchSize(int) 方法对 JVM 中的性能和内存管理非常重要,因为它控制从 JVM 到数据库的网络调用次数以及相应的用于 ResultSet 处理的 RAM。

如果 setFetchSize(10) 被调用并且驱动程序忽略它,则可能只有两个选项:

  1. 尝试其他支持 fetch-size 提示的 JDBC 驱动程序。
  2. 查看 Connection 上特定于驱动程序的属性(创建 Connection 实例时的 URL 和/或属性映射)。

RESULT-SET 是在 DB 上编码以响应查询的行数。ROW-SET 是每次从 JVM 调用到数据库时从 RESULT-SET 中提取的行 block 。这些调用的数量和处理所需的最终 RAM 取决于 fetch-size 设置。

所以如果 RESULT-SET 有 100 行并且 fetch-size 是 10,将有 10 次网络调用来检索所有数据,在任何给定时间使用大约 10*{row-content-size} RAM。

默认的 fetch-size 是 10,相当小。在发布的案例中,驱动程序似乎忽略了 fetch-size 设置,在一次调用中检索所有数据(大 RAM 需求,优化最小网络调用)。

ResultSet.next() 下发生的事情是它实际上并没有一次从RESULT-SET 中获取一行。它从(本地)ROW-SET 中获取它,并在本地客户端上耗尽时从服务器获取下一个 ROW-SET(不可见)。

所有这一切都取决于驱动程序,因为该设置只是一个“提示”,但实际上我发现它适用于许多驱动程序和数据库(已在许多版本的 Oracle、DB2 和 MySQL 中验证)。

关于java - Statement.setFetchSize(nSize) 方法在 SQL Server JDBC 驱动程序中的真正作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1318354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com