SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案

引言

数据导出在项目开发中非常常见,一般的处理流程就是从数据库读取数据,生成excel等格式数据,通过流形式输出给前端。但百万级数据量的数据导出其实用到的并不多,主要在于业务上可能也没有必要性。今天主要讨论下从技术的角度出发,怎样实现百万级数据量导出并且不造成OOM。

思路

由于数据量很大,全量加载必然不行,所以我们采用分批加载,而Mysql本身支持Stream查询,我们可以通过Stream流获取数据,然后将数据逐条刷入到文件中,每次刷入文件后再从内存中移除这条数据,从而避免OOM。

由于采用了数据逐条刷入文件,而且数据量达到百万级,所以文件格式就不要采用excel了,excel2007最大才支持104万行的数据,所以我们选择使用csv格式。

具体实现

  • jpa实现

核心注解如下,需要加入到具体的Repository之上。方法的返回类型定义成Stream。Integer.MIN_VALUE告诉jdbc driver逐条返回数据。

@QueryHints(value = @QueryHint

你可能感兴趣的:(springboot,spring,boot,mysql,后端)