Java 中批量数据库操作怎么结合流式处理导入大文件

风明同学_3982

风明同学_3982

2026-10-04

907人浏览

原创

核心是构建“边读边解、边解边传、边传边存”的持续数据流,需协同文件流式读取、jdbc游标分页与批量提交、jvm容器感知内存控制及绕过orm对象膨胀。

java 中批量数据库操作怎么结合流式处理导入大文件

Java 中批量数据库操作结合流式处理导入大文件,核心是切断“全量加载→内存驻留→批量写入”的错误链路,改为“边读边解、边解边传、边传边存”的持续数据流。这不是单纯调大批次或加内存能解决的,而是从文件读取、数据解析、JDBC 交互到 JVM 资源分配的端到端协同设计。

文件层:用流式读取替代全量加载

无论文件是 CSV、JSON、Excel 还是自定义分隔文本,都必须避免 Files.readAllLines() 或 WorkbookFactory.create(inputStream) 这类一次性加载行为。实际内存占用常达文件体积的 3–5 倍。

  • CSV:用 OpenCSV 的 CsvToBeanBuilder 配合 LineCallbackHandler,或 univocity-parsers 的 RowProcessor 实现逐行回调
  • Excel:优先选 Apache Fesod(非 POI),用 FesodSheet.read(..., new PageReadListener() {...}),默认每页 100 行,内存恒定在 MB 级
  • 大 JSON:不用 Jackson ObjectMapper.readValue(),改用 JsonParser 流式解析,while (parser.nextToken() != JsonToken.END_ARRAY) 手动推进
  • 通用二进制/文本:用 BufferedReader + readLine() 或 InputStream + 自定义分块读取,每次只持有一行或一个逻辑记录

JDBC 层:流式拉取 + 游标分页 + 批量提交

数据库侧不能依赖 LIMIT OFFSET 分页(偏移越大越慢),也不能让 ResultSet 把全部结果缓存在客户端内存里。

DrugBank 数据库
DrugBank 数据库

访问并分析来自 DrugBank 数据库的全面药物信息,包括药物属性、相互作用、靶点、通路、化学结构和药理学数据。用于药物数据、药物发现研究、药理学研究、药物-

下载
  • 读取端:MySQL 加 ?useCursorFetch=true&fetchSize=1000,PostgreSQL 设 statement.setFetchSize(1000) 并配 ResultSet.TYPE_FORWARD_ONLY;驱动会按需从服务端拉取,不囤积
  • 写入端:禁用自动提交,conn.setAutoCommit(false);每 500–2000 条调一次 ps.executeBatch() + ps.clearBatch();单批完成后立即 clear() 引用,促 Minor GC
  • 分页逻辑:用游标分页代替偏移分页,例如 SELECT * FROM t WHERE id > ? ORDER BY id LIMIT 1000,下一批把上批最大 id 当作新 cursor
  • BLOB 处理:对超大二进制字段,必须用 ps.setBinaryStream(index, inputStream, length),严禁 setBytes() 或 setBlob(byte[])

JVM 与连接池:控住堆外开销,防容器被 OOMKilled

Docker 容器内存超限,90% 是因为只管了堆内存(-Xmx),却放任元空间、线程栈、直接内存和连接池缓冲疯长。

  • JVM 启用容器感知:-XX:+UseContainerSupport(JDK 8u191+ 默认开启),再设 -XX:MaxRAMPercentage=70.0 让堆自动适配容器限制
  • 压缩线程栈:-Xss256k(默认 1MB),批量任务常启数十线程,省出上百 MB
  • 约束直接内存:-XX:MaxDirectMemorySize=128m,尤其 HikariCP 和 MyBatis Batch 场景必加
  • HikariCP 控连接数:maximumPoolSize ≤ CPU 核数 × 2(如容器限制 2 核,则 ≤ 4),避免连接对象堆积和线程争抢
  • 导入前临时优化 DB:MySQL 可关唯一校验、禁用非关键索引;事务日志调大,commit 频率控制在 100–500 条/次

框架层:绕过 ORM 的对象膨胀陷阱

MyBatis 或 JPA 在百万级导入中极易成为瓶颈——代理对象、懒加载、一级二级缓存、全字段映射都会制造大量冗余对象。

  • 读取时不用 List<entity></entity>,改用 Map<string object></string> 或轻量 DTO,跳过代理生成与字段校验
  • 写入时避免 @Insert + <foreach></foreach> 拼 SQL,改用原生 JDBC PreparedStatement 批处理,减少框架解析开销
  • 禁用 MyBatis 的二级缓存和延迟加载,configuration.setLazyLoadingEnabled(false)
  • 若必须用 MyBatis,启用 Cursor<t></t> 替代 List<t></t>,配合 @Select 返回 Cursor 类型,底层走流式 ResultSet

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java 数据库

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9637

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6802

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6012

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1044

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

868

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1276

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2529

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19871

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1135

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习