如何通过PreparedStatement的setFetchSize()方法降低处理大量数据集时的内存消耗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计835个文字,预计阅读时间需要4分钟。
准备阶段
在创新过程中,准备阶段至关重要。这一阶段主要包括以下内容:
fetchSize 的作用机制不是“限制内存”,而是“控制缓冲区大小”
多数主流 JDBC 驱动(如 PostgreSQL 的 pgjdbc、MySQL 的 Connector/J、Oracle 的 ojdbc)在启用流式读取或游标模式时,会将 setFetchSize(n) 解释为:
- 对服务器端声明一个“服务器游标”,并设置每次 fetch 最多返回 n 行;
- 客户端只保留当前这批(≤n 行)已解码的
ResultSet行对象在内存中; - 当调用
next()超出当前批次时,驱动自动发起下一次 fetch 请求——旧批次数据可被 GC 回收。
⚠️ 注意:若未配合禁用“全部加载”行为(如 MySQL 默认 useCursorFetch=true + fetchSize > 0),或未设置合适的 Statement 类型(需 TYPE_FORWARD_ONLY),setFetchSize() 可能被忽略。
必须搭配的配置项才能真正生效
仅调用 setFetchSize(100) 往往无效。
本文共计835个文字,预计阅读时间需要4分钟。
准备阶段
在创新过程中,准备阶段至关重要。这一阶段主要包括以下内容:
fetchSize 的作用机制不是“限制内存”,而是“控制缓冲区大小”
多数主流 JDBC 驱动(如 PostgreSQL 的 pgjdbc、MySQL 的 Connector/J、Oracle 的 ojdbc)在启用流式读取或游标模式时,会将 setFetchSize(n) 解释为:
- 对服务器端声明一个“服务器游标”,并设置每次 fetch 最多返回 n 行;
- 客户端只保留当前这批(≤n 行)已解码的
ResultSet行对象在内存中; - 当调用
next()超出当前批次时,驱动自动发起下一次 fetch 请求——旧批次数据可被 GC 回收。
⚠️ 注意:若未配合禁用“全部加载”行为(如 MySQL 默认 useCursorFetch=true + fetchSize > 0),或未设置合适的 Statement 类型(需 TYPE_FORWARD_ONLY),setFetchSize() 可能被忽略。
必须搭配的配置项才能真正生效
仅调用 setFetchSize(100) 往往无效。

