# test-export-insert **Repository Path**: huangsg/test-export-insert ## Basic Information - **Project Name**: test-export-insert - **Description**: 百万级多线程大数据量导出到文件,多线程大数据量导入到文件,多线程大数据量生成测试数据 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-01-10 - **Last Updated**: 2024-05-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多线程实现百万级数据导出到excel ## **考虑前提:** 大数据量导出到文件,首先需要考虑的是内存溢出的场景:数据库读取数据到内存中、将数据写入到excel进行大量的IO操作。然后考虑到一个文件数据过大,用户打开慢,体验不好。针对这些问题的考虑,采用多线程的方式多个线程同时处理查询数据,一个线程生成一个excel,最后在合并数据返回,以达到提高效率的目的。 ## **实现思路:** 1. 计算导出数据的总条数:dataTotalCount 2. 合理设置每个excel的数据的数量(避免打开一个excel时间过长):LIMIT 3. 计算出需要导出的excel个数(线程个数):count=dataTotalCount/ LIMIT + (dataTotalCount% LIMIT > 0 ? 1 : 0) 4. 将分页、生成文件路径信息,初始化到一个队列里面,队列的大小是线程的数量,对每个文件开启一个线程,异步执行导出,文件全部导出结束,此时异步转成同步,将最终生成的excel文件生成zip压缩包。 # 多线程实现百万级数据插入sql ## **考虑前提:** 1. 多条线程并发插入数据,每个线程插入50000条数据。 2. 在当前线程性能内,利用并发生成要插入的用户信息。 3. 最大的难点是自己多次测试判断单次批量插入数据库最大条数。 4. 因为单次批量插入的数量不合理 多线程的优势就体现不出来。单次插入时间过长的话就超过最大连接时长 数据库连接管理: ## 注意 1. 并发插入的时候如果数据主键自增,把实体类里的 主键自增配置去掉,不去掉的话,mybatis plus 批量新增的时候会在当前的线程事务内新增主键id在缓存里, 2. 这样就失去了mysql主键自增解决冲突的效果,而且很容易出现主键冲突。 3. 并发最容易的出现问题 内存溢出oom,自己在写的时候千万注意集合没用了,手动清空掉数据,因为数据库连接池是线程安全的,所以不需要手动关闭连接。