0

0

Spring Batch CSV 处理机制详解:流式分块读写原理与实践

花韻仙語

花韻仙語

发布时间:2026-02-11 09:48:45

|

339人浏览过

|

来源于php中文网

原创

Spring Batch CSV 处理机制详解:流式分块读写原理与实践

spring batch 并非一次性加载全部数据,而是基于流式 i/o 与分块(chunk)机制,按指定大小(如每批 10 行)逐批读取、处理、写入,兼顾内存效率与事务一致性。

Spring Batch 的核心优势之一,正在于其流式分块处理(Chunk-Oriented Processing)模型——它彻底规避了“全量加载→全量处理→全量输出”的内存陷阱。以您提出的 10,000 行 CSV 场景为例(chunkSize = 10),整个流程严格遵循以下循环逻辑:

  1. Reader 按需拉取:FlatFileItemReader 底层封装 BufferedReader,仅在当前 chunk 需要时,从文件流中顺序读取 最多 10 行(跳过表头后),解析为 Student 对象并缓存在内存中;
  2. Processor 批量转换:processor 接收这 10 个对象组成的集合(实际为单个对象的逐个调用,但受 chunk 事务约束),执行业务逻辑(如字段追加 !);
  3. Writer 原子写入:FlatFileItemWriter 将该批次 10 个处理后的对象,通过 LineAggregator 格式化为 CSV 行,并追加写入目标文件(非覆盖);
  4. 事务提交:整个读-处理-写三阶段被包裹在一个数据库事务中(由 PlatformTransactionManager 管理),任一环节失败则回滚本 chunk,确保数据一致性。

✅ 正确理解:整个过程重复 10,000 ÷ 10 = 1,000 次,峰值内存仅需容纳约 10 条记录 + 开销,而非 10,000 条。

⚠️ 关键注意事项:

vizcom.ai
vizcom.ai

AI草图渲染工具,快速将手绘草图渲染成精美的图像

下载
  • Reader 不是“预加载”:reader() 方法仅初始化 Reader 实例(如您的代码中 System.out.println("reader") 在 Job 启动时打印),真正读取发生在 Step 执行时按需触发;
  • Writer 必须支持追加:FlatFileItemWriter 默认使用 FileSystemResource 时,若目标文件已存在,需显式配置 setAppendAllowed(true)(默认 false,会清空重写);
  • 事务边界即 chunk 边界:chunk(10) 意味着每处理 10 条即提交一次事务。若需更高吞吐,可适度增大 chunk size(需权衡内存与事务粒度);
  • 数据库场景同理:JDBC JdbcCursorItemReader 或 JdbcPagingItemReader 同样支持分页/游标式流读取,配合 JdbcBatchItemWriter 批量插入,实现“读 10 条 → 处理 → 写入 dbB 的 10 条”。

以下为数据库迁移的简化伪代码示意(基于 JdbcCursorItemReader):

@Bean
public JdbcCursorItemReader dbReader(DataSource dataSource) {
    JdbcCursorItemReader reader = new JdbcCursorItemReader<>();
    reader.setDataSource(dataSource);
    reader.setSql("SELECT id, name, amount FROM account WHERE status = 'ACTIVE'");
    reader.setRowMapper((rs, rowNum) -> 
        new TransferRecord(rs.getLong("id"), rs.getString("name"), rs.getBigDecimal("amount"))
    );
    return reader;
}

@Bean
public JdbcBatchItemWriter dbWriter(DataSource dataSource) {
    JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>();
    writer.setDataSource(dataSource);
    writer.setSql("INSERT INTO account_bak (id, name, amount) VALUES (?, ?, ?)");
    writer.setItemPreparedStatementSetter((item, ps) -> {
        ps.setLong(1, item.getId());
        ps.setString(2, item.getName());
        ps.setBigDecimal(3, item.getAmount());
    });
    return writer;
}

总结而言,Spring Batch 的价值远不止“多写了几个类”——它通过标准化的流式分块、声明式事务、失败重启、监控统计等能力,将原本易出错的手动批处理,转化为可运维、可伸缩、可恢复的企业级批量作业。合理配置 chunkSize、选择合适 Reader/Writer、理解事务边界,是发挥其威力的关键前提。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

118

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

77

2026.01.26

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

367

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2091

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

355

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

328

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

414

2023.10.16

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号