easyexcel导入导出百万条数据思路分析
导入万条数据
一条数据200个字 一个文字2字节byte 一条数据相当于400byte 大约等于0.5kb
一万条数据大概5000kb 相当于5M
导入模块的jvm内存设置为8G
- 导入进行限制,系统只支持同时有200个人同时进行导入操作,通过redis进行记录,操作结束后对redis中值进行减1,同时对当前在线导入的数据量进行限制,只允许同时导入 100万条数据,通过redis记录,新建一条导入数据保存到数据库,同时发送一条mq消息给websocket,例如导入任务开始,此时消息会展示在界面上
- 通过导入传递的参数然后通过反射的方式去找到校验类和保存类
- 读取数据通过线程池进行多线程操作校验,校验时记录错误数据,如果出现失败存在一个list中,跳出保存,走上传错误文件逻辑,将错误原因记录在文件中
- 校验成功后在一个事务中分批次保存数据 单次保存500条,保存后将已保存的数据clear,方便垃圾回收,保存出现错误后回滚事务
- 如果出现需要远程调用feign的情况 增加seata 做控制
- 简单保存则直接在excel中引入需要保存的service与mapper
导出百万条数据
机器为16核 按照io操作
- 导出通过线程池控制,导出任务都放在线程池中运行,核心线程数设置为16,最大线程数设置为25,队列大小设置为30,导出时先判断队列是否已经满了,满了则直接提示错误,没满则新建一条导出数据保存到数据库,同时发送一条mq消息给websocket,例如导出任务开始,此时消息会展示在界面上
- 通过导出传递的参数反射获取查询的类,然后通过循环分页去查询结果,默认每次查询100条,可以自定义查询条数,将查询进度实时展示在界面上
- 每次查询后将结果写入excel中