在开发中,我们经常会遇到统计数据,将数据导出到excel表格中。
由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后再生成excel返回给客户端。
如果数据量过大,采用默认的读取方式(一次性获取全部)会导致内存飙升,甚至是内存溢出(OOM),而导出数据又需要查询大量的数据,因此采用流式查询就比较合适了。
JDBC三种读取方式:
- 一次性全部(默认):一次获取全部
- 流式:多次获取,一次一行
- 游标:多次获取,一次多行
模拟excel导出
创建数据表
1 | CREATE TABLE `user` ( |
造数据
新建springboot项目,使用批处理插入500万条数据到MySQL
Pom文件
1 |
|
yaml配置文件
注意:使用批量提交数据,url一定要设置允许重写批量提交【rewriteBatchedStatements=true】,以及此时的sql语句一定不能有分号,否则有【BatchUpdateException】异常。
1 | server: |
1 | package com.itjing.excel.util; |
1 |
|
模拟查询
创建用户导出实体和查询实体
1 | package com.itjing.excel.vo; |
1 | package com.itjing.excel.dto; |
创建持久DAO
1 | package com.itjing.excel.dao; |
映射文件
1 |
|
用户业务类
1 | package com.itjing.excel.service; |
1 | package com.itjing.excel.service.impl; |
用户控制器
1 | package com.itjing.excel.controller; |
游标查询
游标查询不会造成OOM
1 | package com.itjing.excel.dao; |
映射文件
1 |
|
1 | package com.itjing.excel.service; |
1 | package com.itjing.excel.service.impl; |
1 | package com.itjing.excel.controller; |