hashmap暂存数据库批量插入数据本质是内存聚合工具,用于去重、合并、分组,不参与sql执行;真正批量插入依赖jdbc addbatch/executebatch或orm批量api。

用 HashMap 暂存数据库批量插入数据,本质上不是 HashMap 的典型用途——它不负责数据持久化,也不直接参与 SQL 执行。但你可以用它做内存中的临时结构化缓存,比如按业务键(如订单号、用户ID)聚合待插入的数据、去重、合并字段、或预计算批次分组。关键在于:HashMap 是工具,真正批量插入靠的是 JDBC 的 addBatch() + executeBatch() 或 ORM 框架的批量 API。
用 HashMap 做“去重+聚合”暂存
比如接收一批日志记录,同一用户 ID 可能重复出现,你想每用户只插一条最新记录:
- 以
userId为 key,完整对象(如UserSummary)为 value - 遍历时若 key 已存在,就用新数据覆盖或按需合并(如更新时间戳、累加次数)
- 遍历完,把
map.values()转成 List,再交给批量插入逻辑
用 HashMap 分组,按条件拆批
某些数据库对单次 batch 大小有限制(如 MySQL 默认 max_allowed_packet),或业务要求按租户/日期分批提交:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 以分组维度(如
"tenant_" + tenantId或"date_" + yyyyMMdd)为 key - value 是
List<record></record>,用computeIfAbsent自动初始化 - 最后遍历 map.entrySet(),对每个 value 列表执行独立的 batch 插入
注意 HashMap 本身不保证线程安全
如果多个线程并发往同一个 HashMap 写数据(比如异步解析文件后塞入):
- 用
ConcurrentHashMap替代,避免扩容时死循环或数据丢失 - 或在外部加锁(如
synchronized块),但会降低吞吐 - 更推荐方式:每个线程维护自己的 HashMap,最后合并(用
putAll或流式收集)
别把 HashMap 当数据库用
HashMap 只在 JVM 堆内存中存在,进程重启即丢失。它不能替代真正的暂存方案:
- 数据量大?考虑临时表(
CREATE TEMPORARY TABLE)或内存数据库(如 H2) - 需要跨服务共享?用 Redis 或消息队列暂存中间状态
- 只是为减少数据库 round-trip?优先优化 JDBC 批处理参数(
rewriteBatchedStatements=truefor MySQL)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










