在Java 中应该怎么处理百万级数据插入 、删除
在Java中处理百万级数据的插入和删除操作时,需结合数据库优化、内存管理及并发控制等策略。以下是具体实践方案:
- 使用连接池:管理数据库连接,避免频繁创建/销毁连接
- 手动提交事务:事务管理关闭自动提交,将多个插入操作封装在一个事务中,减少数据库IO次数
- 批处理:通过将多条SQL语句合并为一个批次提交,减少网络开销和数据库事务次数。建议每1000-2000条数据执行一次批处理。
- 分页处理大数据量:避免一次性将大数据量加载进内存,导致OOM
- 多线程并行处理:使用线程池(如ExecutorService)分片处理数据,充分利用多核CPU
批量插入:
JDBC的批量插入功能是提高插入性能的一个关键方法。通过PreparedStatement对象的addBatch()和executeBatch()方法。
Mybatis批量插入:(1)使用 MyBatis-Plus 的 saveBatch 方法(2)使用 <foreach> 标签实现批量插入。
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO my_table (column1, column2) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.column1}, #{item.column2})
</foreach>
</insert>
批量删除:(1)查找数据的共性条件删除 (2)采用类似批量插入的方式批量删除数据
如果是导入、导出,(1)导入文件使用CSV格式(2)使用EasyExcel等工具分Sheet页读取,结合多线程并行导入(3)流式处理
避免一次性加载全部数据到内存,采用流式API(如Java 8 Stream)逐行处理
MYSQL:在 MySQL 的 JDBC URL 中添加 rewriteBatchedStatements=true 参数,可以让 MySQL 驱动将多条插入语句合并为一条,从而减少网络和数据库的开销。

浙公网安备 33010602011771号