数据库流式查询一、核心特点二、主流实现方式三、典型应用场景四、代码示例数据库流式查询是一种边读取边处理数据的查询方式不会一次性将全量结果加载到内存能大幅降低内存占用避免大数据量场景下的OOM问题同时省去手动分页的复杂逻辑。一、核心特点内存友好数据逐行/小批次读取处理处理完即释放百万级数据场景下内存峰值可低至几十MB。性能稳定无需深度分页仅执行一次查询避免分页查询的多次IO开销。实时处理读取数据的同时可同步执行业务逻辑适配低延迟处理需求。二、主流实现方式MyBatis/MyBatis-Plus 游标实现通过Cursor迭代器逐条获取数据需保持数据库连接开启搭配Transactional和try-with-resources使用是Java生态最常用的方案。ResultHandler 回调方式通过Options注解配置流式参数查询结果直接回调处理无需手动管理迭代器适配简单数据处理场景。云原生流数据库方案如Azure Databricks结构化流、RisingWave等支持直接从Kafka、云存储等数据源实时流式读取适配实时分析、事件驱动场景。三、典型应用场景百万/千万级大数据量导出、数据迁移实时数据流处理如金融交易、物联网数据采集低内存资源环境下的海量数据遍历处理四、代码示例packagecom.example.mapper;importcom.example.entity.User;importorg.apache.ibatis.annotations.*;importorg.apache.ibatis.cursor.Cursor;importorg.apache.ibatis.session.ResultHandler;importjava.util.List;MapperpublicinterfaceUserMapper{/** * 方式一使用 Cursor 进行流式查询 * 注意 * 1. 返回类型必须是 CursorT * 2. 需要配合 Options 设置 fetchSize 和 resultSetType * 3. 调用方必须保持事务开启并在 try-with-resources 中关闭 Cursor */Select(SELECT id, username, email, age FROM users)Options(resultSetTypeResultSetType.FORWARD_ONLY,fetchSize1000)CursorUserselectAllUsersWithCursor();/** * 方式二使用 ResultHandler 进行流式回调处理 * 注意 * 1. 返回类型必须是 void * 2. 最后一个参数必须是 ResultHandlerT * 3. MyBatis 每读取一行数据就会调用 handler.handleResult */Select(SELECT id, username, email, age FROM users)Options(resultSetTypeResultSetType.FORWARD_ONLY,fetchSize1000)voidselectAllUsersWithHandler(ResultHandlerUserhandler);}
数据库流式查询
数据库流式查询一、核心特点二、主流实现方式三、典型应用场景四、代码示例数据库流式查询是一种边读取边处理数据的查询方式不会一次性将全量结果加载到内存能大幅降低内存占用避免大数据量场景下的OOM问题同时省去手动分页的复杂逻辑。一、核心特点内存友好数据逐行/小批次读取处理处理完即释放百万级数据场景下内存峰值可低至几十MB。性能稳定无需深度分页仅执行一次查询避免分页查询的多次IO开销。实时处理读取数据的同时可同步执行业务逻辑适配低延迟处理需求。二、主流实现方式MyBatis/MyBatis-Plus 游标实现通过Cursor迭代器逐条获取数据需保持数据库连接开启搭配Transactional和try-with-resources使用是Java生态最常用的方案。ResultHandler 回调方式通过Options注解配置流式参数查询结果直接回调处理无需手动管理迭代器适配简单数据处理场景。云原生流数据库方案如Azure Databricks结构化流、RisingWave等支持直接从Kafka、云存储等数据源实时流式读取适配实时分析、事件驱动场景。三、典型应用场景百万/千万级大数据量导出、数据迁移实时数据流处理如金融交易、物联网数据采集低内存资源环境下的海量数据遍历处理四、代码示例packagecom.example.mapper;importcom.example.entity.User;importorg.apache.ibatis.annotations.*;importorg.apache.ibatis.cursor.Cursor;importorg.apache.ibatis.session.ResultHandler;importjava.util.List;MapperpublicinterfaceUserMapper{/** * 方式一使用 Cursor 进行流式查询 * 注意 * 1. 返回类型必须是 CursorT * 2. 需要配合 Options 设置 fetchSize 和 resultSetType * 3. 调用方必须保持事务开启并在 try-with-resources 中关闭 Cursor */Select(SELECT id, username, email, age FROM users)Options(resultSetTypeResultSetType.FORWARD_ONLY,fetchSize1000)CursorUserselectAllUsersWithCursor();/** * 方式二使用 ResultHandler 进行流式回调处理 * 注意 * 1. 返回类型必须是 void * 2. 最后一个参数必须是 ResultHandlerT * 3. MyBatis 每读取一行数据就会调用 handler.handleResult */Select(SELECT id, username, email, age FROM users)Options(resultSetTypeResultSetType.FORWARD_ONLY,fetchSize1000)voidselectAllUsersWithHandler(ResultHandlerUserhandler);}