核心是“控得稳”:分页读取+流式结果集防溢出,批量写入+手动事务控制,连接与线程合理复用,异常容错+断点续传。

要编写高吞吐量的 Java 数据库同步工具,核心不是“写得快”,而是“控得稳”——控制连接、事务、批次、线程和资源释放节奏。下面从四个关键环节给出可落地的实践方式。
分页读取 + 流式结果集防内存溢出
避免一次性查几百万行把 JVM 堆撑爆。用数据库原生分页(如 MySQL 的 LIMIT OFFSET 或 Oracle 的 ROWNUM),每次取 5 万~20 万条;对超大表,优先用游标或基于主键/时间戳的增量拉取(如 WHERE update_time > ?)。
使用 JDBC 的 setFetchSize(Integer.MIN_VALUE) 启用流式读取(尤其适用于 MySQL Connector/J 8.0+),让 ResultSet 不缓存全部结果,边读边处理。
批量写入 + 手动事务控制
单条 INSERT 效率极低。必须用 PreparedStatement 的 addBatch() / executeBatch(),每批 1000~5000 条提交一次:
- 调用 connection.setAutoCommit(false) 关闭自动提交
- 每批执行后调用 connection.commit(),失败则 rollback()
- 避免在循环内频繁 commit(太碎)或只 commit 一次(太重)
注意:MyBatis 用户可用
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
连接与线程合理复用
不要为每个表或每批新建 Connection —— 使用 HikariCP 等高性能连接池,配置 maximumPoolSize=8~16(视目标库负载而定)。
同步多张表时,可用固定大小线程池(如 Executors.newFixedThreadPool(4))并行处理,但需注意:
- 源库和目标库连接池要独立配置,避免争抢
- 线程数 ≠ 越多越好,超过 8 个常因锁竞争或网络带宽瓶颈反降速
- 建议搭配 CountDownLatch 或 CompletableFuture.allOf() 控制整体完成
异常容错 + 断点续传能力
生产环境同步不能“一崩全重来”。关键设计包括:
- 记录每批次的起始 ID 或时间戳到一张 sync_checkpoint 表中
- 任务启动时先查 checkpoint,从断点继续,而非从头扫
- 对唯一键冲突(如 REPLACE INTO 或 ON DUPLICATE KEY UPDATE)显式捕获 SQLState 23xxx 异常,区分跳过或覆盖逻辑
- 网络中断、连接超时等场景,应自动重试(最多 3 次),并记录 warn 日志
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










