MySql大结果集导出处理(先做记录,原理下来再研究)

笔者在开发中处理MySql大结果集时碰到一个问题,单表数据有2000w,而且数据是每天递增的,需要每天凌晨2点用定时任务导出到ftp。

方式一:查出所有数据到内存处理(不可行)

​ 直接使用SELECT * FROM TABLE.... 查出所有的数据到内存,然后再处理。由于数据量太大了,直接就报java.lang.OutOfMemoryError

方式二:使用limit 分页查询(不可行)

​ 由于方式一对于大结果集肯定是不可行、于是我一开始就使用limit分页的方式进行查询,一次性读取部分数据然后处理。虽然不会出现OOM的错误,但是这种查询方式效率极其低下。

方式三:使用流式读取

        //以JdbcTemplate方式为例,其他方式也是相同设置setFetchSise(int arg)即可。
        JdbcTemplate jdbcTemplate = new JdbcTemplate();

        StringBuilder sb = new StringBuilder("SELECT * FROM TABLE...");

        jdbcTemplate.query(sb.toString(), preparedStatement -> {
            //设置流式读取的大小
            preparedStatement.setFetchSize(Integer.MIN_VALUE);
        }, rs -> {
            while (rs.next()) {
                //do somethings ......
            }
            return null;
        });

流式读取的原理是:每次从MySql服务端读取一定数量的数据到内存,然后再处理,所以避免了OOM.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,075评论 2 89
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,767评论 0 30
  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的 2.排他...
    ZyBlog阅读 19,886评论 3 177
  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的。 2.排...
    阿休阅读 4,714评论 0 37
  • 我把对你的思念 绘成了画卷 一笔一笔 画尽五彩的眷恋 我把对你的思念 谱进了歌端 一曲一曲 唱出多少的无奈 我把对...
    多多一粒阅读 200评论 3 3