mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆。

  • 一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了offset,mysql需要将读取位置移动到offset的位置,随着offset增大,取数据也越来越慢;
  • 另外一种办法是:用数据流的方式取数据,这时需要设置:
  1. stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
  2. java.sql.ResultSet.CONCUR_READ_ONLY);
  3. stmt.setFetchSize(Integer.MIN_VALUE);

这时候,mysql jdbc driver,一行行的取结果集。

但这种方式有几个限制:

  1. 只能从该连接只能取完所有结果集后才能运行其他SQL;
  2. resultset.getRow(),是不支持的,调用会抛unsupportedException;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
我在使用该方法的时候出现过类似以下错误:
Caused by: java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@5bdbda4f is still active.No statements may be issued when any streaming result sets are open and in use on a given connection.Ensure that you have called .close() on any active streaming result sets before attempting more queries.
原因就是违反了第一个限制,所以如果查询的数据集没有读取完,其他的sql操作都要另起一个connection。

Mysql遍历大表(Mysql大量数据读取内存溢出的解决方法)的更多相关文章

  1. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  2. 使用solr的DIHandler 构建mysql大表全量索引,内存溢出问题的解决方法

    solr官方给出的解决方式是: DataImportHandler is designed to stream row one-by-one. It passes a fetch size value ...

  3. jdbc读取百万条数据出现内存溢出的解决办法

    本人在做项目实施时,我们使用的是mysql数据库,在不到一个月的时间已经有了2千万条数据,查询的时候非常慢,就写了一个数据迁移的小项目,将这两千万条数据存放到MongoDB中看效率怎么样,再读取数据时 ...

  4. mysql删除大表更快的drop table办法

    mysql删除大表更快的drop table办法 参考资料:https://blog.csdn.net/anzhen0429/article/details/76284320 利用硬链接和trunca ...

  5. mysql left join 右表数据不唯一的情况解决方法

    mysql left join 右表数据不唯一的情况解决方法 <pre>member 表id username1 fdipzone2 terry member_login_log 表id ...

  6. 浅析Mysql 数据回滚错误的解决方法

    介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollbac ...

  7. 浅析Mysql数据回滚错误的解决方法

    介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下   MYSQL的事务处理主要有两种方法.   1.用begin,rollback,commit来实现   begin 开始一个事 ...

  8. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  9. "ORA-00942: 表或视图不存在 "的原因和解决方法

    "ORA-00942: 表或视图不存在 "的原因和解决方法   采用Oracle数据库,使用Powerdesigner设计,生成Sql文件导入后查询出现“ORA-00942: 表或 ...

随机推荐

  1. 在oracle中,select语句查询字段中非纯数字值

    最近,将原来的数字符字段转换为数字时,总报错误:无效数字. 如何找出其中哪些是非数字字符的记录?比较麻烦的事.下面是用Oracle DB自带的函数translate可以找出来的 1.创建测试表 Cre ...

  2. BZOJ1150:[CTSC2007]数据备份

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  3. [转]Unity3D学习笔记(四)天空、光晕和迷雾

    原文地址:http://bbs.9ria.com/thread-186942-1-1.html 作者:江湖风云 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的 ...

  4. Linux keepalived与lvs的深入分析

    一)概述 在本篇文章里,我们会涉及两部份内容,一个是LVS,另一个则是keepalived. 即我们用LVS和keepalived实现了负载均衡及高可用的服务器.   LVS有实现三种IP负载均衡技术 ...

  5. RS-485半双工延时问题

    学习485总线时,遇到延时问题,困扰很久.通过学习知道了485半双工收发时必须延时,以保证系统的稳定性.可靠性.好多资料都介绍了485 防静电.抗干扰电路.惟独没提 每一帧收发停止位(或第9位)的延时 ...

  6. 面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 //普通代码块:在 ...

  7. stm32之内部功能

    本文将提到以下内容: 位带操作 中断 printf重定向 随机数发生器RNG AD/DA DMA 高性能计算能力 加密 ART加速 一.位带操作 在学习51单片机的时候就使用过位操作,通过关键字sbi ...

  8. shell入门-sort排序

    命令:sort 选项:-t:-kn  指定根据某段来排序 这里n代表数字,范围指定n,N.从n到N范围 -n  按数字顺序排列 -r   反序排列 -u  去重复排序 -un 数字顺序排列并去重复,系 ...

  9. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; che

    出现此种错误,我暂时遇到了两次. 1 我的字段的名称和数据库的关键字重合. 上图中的desc是默认降序排列的意思. 2 第二次出现的异常是我在重构代码阶段遇到的一个bug.不过我暂时不能理解,虽然解决 ...

  10. RStudio 断点调试 进入for循环语句调试

    参考: http://www.rstudio.com/ide/docs/debugging/overview 1.进入调试模式 全选代码,点击source即可进入调试模式. 2.进入for 调试 在F ...