千万级测试数据导入

我要开发同款
无恒道长2024年02月23日
28阅读
开发技术java
所属分类网站API
授权协议Apache许可

作品详情

# 多线程实现百万级数据导出到excel## **考虑前提:**大数据量导出到文件,首先需要考虑的是内存溢出的场景:数据库读取数据到内存中、将数据写入到excel进行大量的IO操作。然后考虑到一个文件数据过大,用户打开慢,体验不好。针对这些问题的考虑,采用多线程的方式多个线程同时处理查询数据,一个线程生成一个excel,最后在合并数据返回,以达到提高效率的目的。## **实现思路:**1. 计算导出数据的总条数:dataTotalCount2. 合理设置每个excel的数据的数量(避免打开一个excel时间过长):LIMIT 3. 计算出需要导出的excel个数(线程个数):count=dataTotalCount/ LIMIT + (dataTotalCount% LIMIT > 0 ? 1 : 0)4. 将分页、生成文件路径信息,初始化到一个队列里面,队列的大小是线程的数量,对每个文件开启一个线程,异步执行导出,5. 文件流导出6. 文件全部导出结束,此时异步转成同步,将最终生成的excel文件生成zip压缩包。# 多线程实现百万级数据插入sql## **考虑前提:**1. 多条线程并发插入数据,每个线程插入50000条数据。2. 在当前线程性能内,利用并发生成要插入的用户信息,利用 stream的并行流提高效率 。.limit(count) .parallel() 3. 最大的难点是自己多次测试判断单次批量插入数据库最大条数。4. 因为单次批量插入的数量不合理 多线程的优势就体现不出来。单次插入时间过长的话就超过最大连接时长数据库连接管理:## 注意 1. 并发插入的时候如果数据主键自增,把实体类里的 主键自增配置去掉,不去掉的话,mybatis plus 批量新增的时候会在当前的线程事务内新增主键id在缓存里,2. 这样就失去了mysql主键自增解决冲突的效果,而且很容易出现主键冲突。3. 并发最容易的出现问题 内存溢出oom,自己在写的时候千万注意集合没用了,手动清空掉数据,因为数据库连接池是线程安全的,所以不需要手动关闭连接。4. mysql 5.8,导入2百万数据141s,100万数据10s左右。![img.png](img.png)![4d448b6dce0ea6583f3bd435fd6123e0.png](src%2Fmain%2Fresources%2F4d448b6dce0ea6583f3bd435fd6123e0.png)
查看全文
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论