点击空白处退出提示
千万级测试数据导入
我要开发同款作品详情
## **考虑前提:**
大数据量导出到文件,首先需要考虑的是内存溢出的场景:数据库读取数据到内存中、将数据写入到excel进行大量的IO操作。然后考虑到一个文件数据过大,用户打开慢,体验不好。针对这些问题的考虑,采用多线程的方式多个线程同时处理查询数据,一个线程生成一个excel,最后在合并数据返回,以达到提高效率的目的。
## **实现思路:**
1. 计算导出数据的总条数:dataTotalCount
2. 合理设置每个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
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
评论