数据库流式查询

数据库流式查询

数据库流式查询是一种边读取边处理数据的查询方式,不会一次性将全量结果加载到内存,能大幅降低内存占用,避免大数据量场景下的OOM问题,同时省去手动分页的复杂逻辑。

一、核心特点

  • 内存友好:数据逐行/小批次读取处理,处理完即释放,百万级数据场景下内存峰值可低至几十MB。
  • 性能稳定:无需深度分页,仅执行一次查询,避免分页查询的多次IO开销。
  • 实时处理:读取数据的同时可同步执行业务逻辑,适配低延迟处理需求。

二、主流实现方式

  1. MyBatis/MyBatis-Plus 游标实现
    通过Cursor迭代器逐条获取数据,需保持数据库连接开启,搭配@Transactional和try-with-resources使用,是Java生态最常用的方案。
  2. ResultHandler 回调方式
    通过@Options注解配置流式参数,查询结果直接回调处理,无需手动管理迭代器,适配简单数据处理场景。
  3. 云原生流数据库方案
    如Azure Databricks结构化流、RisingWave等,支持直接从Kafka、云存储等数据源实时流式读取,适配实时分析、事件驱动场景。

三、典型应用场景

  • 百万/千万级大数据量导出、数据迁移
  • 实时数据流处理(如金融交易、物联网数据采集)
  • 低内存资源环境下的海量数据遍历处理

四、代码示例

java 复制代码
package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.session.ResultHandler;

import java.util.List;

@Mapper
public interface UserMapper {

    /**
     * 方式一:使用 Cursor 进行流式查询
     * 注意:
     * 1. 返回类型必须是 Cursor<T>
     * 2. 需要配合 @Options 设置 fetchSize 和 resultSetType
     * 3. 调用方必须保持事务开启,并在 try-with-resources 中关闭 Cursor
     */
    @Select("SELECT id, username, email, age FROM users")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
    Cursor<User> selectAllUsersWithCursor();

    /**
     * 方式二:使用 ResultHandler 进行流式回调处理
     * 注意:
     * 1. 返回类型必须是 void
     * 2. 最后一个参数必须是 ResultHandler<T>
     * 3. MyBatis 每读取一行数据就会调用 handler.handleResult
     */
    @Select("SELECT id, username, email, age FROM users")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
    void selectAllUsersWithHandler(ResultHandler<User> handler);
 }
相关推荐
2401_894915532 分钟前
新手落地 Geo 优化:源码下载、依赖安装、数据库初始化完整步骤
运维·服务器·数据库·人工智能·缓存·开源
万维易源9 分钟前
免费药品信息查询:用API 读懂常用药
java·前端·数据库·药品信息·药品查询·药品查询api
wear工程师13 分钟前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
hard_hot14 分钟前
RabbitMQ异步下单架构设计
java·rabbitmq·java-rabbitmq
郑州光合科技余经理22 分钟前
餐饮预定系统架构拆解:订单链路、权限组织与私有化源码交付
java·开发语言·前端·数据库·人工智能·系统架构·php
xfhuangfu32 分钟前
Oracle 19c 本地索引分区变为 UNUSABLE 后的空间占用验证
数据库·oracle
杨云龙UP36 分钟前
Oracle ASH 报告详解:与 AWR 的区别、使用场景及生成方法
linux·运维·服务器·数据库·oracle
vx-程序开发37 分钟前
django汽车租赁系统---附源码25360
java·javascript·spring boot·python·eclipse·django·php
zhougl99642 分钟前
Java实现腾讯云开发者社区列表爬虫
java·爬虫·腾讯云
智码看视界43 分钟前
Day49-AI微服务化-将大模型能力封装为标准微服务
java·微服务·ai·架构·大模型·sse流式输出·ai中台