Mybatis Cursor fetchSize
时间: 2025-02-22 08:05:26 浏览: 42
### MyBatis 中使用 Cursor 的 `fetchSize` 属性
为了优化查询性能,在 MyBatis 中可以配置 `fetchSize` 参数来控制数据库驱动程序每次从服务器获取的数据行数。对于大规模数据集,适当设置此参数能够显著减少内存占用并提高效率。
#### 设置 Fetch Size 方法
当定义 SQL 映射语句时,可以通过 XML 或者注解方式指定 `fetchSize` 值:
- **XML 方式**
通过 `<select>` 标签中的属性直接设定:
```xml
<select id="findUsers" parameterType="int" resultMap="userResultMap" fetchSize="100">
SELECT * FROM users WHERE status = #{status}
</select>
```
- **注解方式**
利用 Java 注解的形式应用到接口方法上:
```java
@Select("SELECT * FROM users WHERE status=#{status}")
@Options(fetchSize=100)
List<User> findUsers(@Param("status") int userStatus);
```
以上两种情况下都将 `fetchSize` 设定为 100 行记录[^4]。
#### 流式查询与游标的结合
除了简单的批量读取外,还可以采用更高效的流式处理模式——即基于 JDBC 游标的实现。这允许逐条而不是一次性加载全部结果集进入 JVM 内存空间内。具体做法如下所示:
```java
// Mapper 接口声明
public interface UserMapper {
@Select("SELECT * FROM users ORDER BY id")
@Options(fetchSize=Integer.MIN_VALUE, useCache=false, flushCache=true)
Cursor<User> selectAllAsStream();
}
// Service 实现类调用
try (Cursor<User> cursor = mapper.selectAllAsStream()) {
while (cursor.hasNext()) {
User user = cursor.next();
process(user); // 处理单个对象逻辑
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
```
这里特别指出的是将 `fetchSize` 赋予最小整数值 (`Integer.MIN_VALUE`) 可触发某些数据库连接器启用游标机制[^3]。
#### 性能优化建议
- 对于非常大的表操作,推荐优先尝试调整合适的 `fetchSize` 数值;
- 如果遇到内存溢出等问题,则应考虑改用游标形式做增量迭代访问;
- 尽可能避免不必要的字段检索,仅选取所需列可降低网络传输开销;
- 合理规划索引结构有助于加速特定条件下的扫描速度。
阅读全文
相关推荐


















