Java批量导入断点续传本质是应用层控制:分批处理、事务隔离、进度落库、异常重试与启动恢复。核心是按主键/时间戳分页读取,每批独立事务并更新import_progress表,失败记日志,重启时自动续传。

Java 中实现批量数据库导入的“断点续传”,本质不是数据库自带功能,而是通过应用层控制事务边界、记录进度、异常恢复来模拟。核心思路是:将大任务拆分为可独立执行的小批次,每批提交后持久化当前完成位置(如最后处理的主键或行号),失败时从该位置继续。
1. 拆分数据源并标记处理位置
不要一次性读取全部数据到内存。推荐按主键/时间戳分页读取原始数据(如 CSV、Excel 或其他数据库):
- 使用 OFFSET + LIMIT(适合主键连续场景)或 WHERE id > ? ORDER BY id LIMIT N(更稳定)分批拉取
- 每批数据附带起始 ID 和结束 ID,作为后续断点标识
- 若源无自增主键,可添加行号字段(如用
ROW_NUMBER())或基于业务唯一字段+时间组合定位
2. 每批操作独立事务 + 进度落库
每一批次插入/更新都放在独立事务中,并在成功后立即记录“已处理到哪”:
- 建一张
import_progress表:job_id VARCHAR, last_processed_id BIGINT, status TINYINT, updated_time DATETIME - 批次处理前先查进度表,确定本次起始位置;处理完立即更新
last_processed_id和状态为 “success” - 使用
INSERT ... ON DUPLICATE KEY UPDATE(MySQL)或MERGE(Oracle/PostgreSQL)避免重复写入
3. 异常捕获与重试机制
单批次失败不中断整体流程,而是记录错误并跳过,后续可人工介入或自动重试:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 捕获 SQLException 后,把失败批次的范围(如 id 从 10001 到 10100)写入
import_error_log表 - 提供按 job_id 查询错误详情的接口,支持手动修正后调用
retryBatch(startId, endId) - 对网络超时类异常可配置简单重试(如最多 3 次),但主键冲突、数据格式错误等需人工确认
4. 启动时自动恢复(关键)
每次导入任务启动时,优先检查是否存在未完成的 job_id:
- 根据 job_id 查询
import_progress表,若存在且 status = 'running' 或 'error',则读取last_processed_id - 自动设置本次起始位置为
last_processed_id + 1(或对应分页偏移) - 更新 status 为 'running',防止多实例并发冲突(可用数据库 for update 或分布式锁保障)
不复杂但容易忽略的是:进度表必须和业务表在同一个数据库、同一事务中更新,否则无法保证原子性。另外,批量插入建议配合 rewriteBatchedStatements=true(MySQL)或 useServerPrepStmts=false 提升性能。

















