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. Bootstrap CSS教程

    Bootstrap 教程 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...

  2. android开发之数据库存取图片

    Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...

  3. java"=="与equals()方法的对照

    总结:String s=new String(); s是在堆内存里的 String s2=new String(); s2是在堆内存又重新生成的一个. package com.da; //逆向思维:i ...

  4. System.getProperty()获取系统的相关属性

    我们在编程的过程中有时候需要获取系统的相关属性,今天就让我们一起来学习学习如何获取系统的相关属性 至于System.getProperty(param)中的各个参数的概念请看下表. java.vers ...

  5. Python-通过socket实现一个小型的端口检测工具

    实验机器IP:192.168.220.139,端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import ...

  6. Linux TCP通信例子

    TCP通信的C/S模型 ///server.c #include <sys/types.h> #include <sys/socket.h> #include <stdi ...

  7. js中Math.round、parseInt、Math.floor和Math.ceil小数取整总结(转)

    js中Math.round.parseInt.Math.floor和Math.ceil小数取整总结 Math.round.parseInt.Math.floor和Math.ceil 都可以返回一个整数 ...

  8. Jmeter JDBC Request的sql语句不支持;号

    Jmeter JDBC Request的sql语句不支持:号,如果要批量插入数据,则需要使用以下方式 INSERT INTO bank_info( `id`, `bank_code`, `bank_n ...

  9. windows 服务器安装python及其基本库

    步骤如下: 一.安装python软件: 1.进入windows服务器,从网址下载 python-3.5.4-amd64软件 到桌面: 2.在软件点右键,再“”以管理员身份运行“”,输入管理员密码: 3 ...

  10. URAL 2021 Scarily interesting! (贪心+题意)

    题意:给定两个队伍的每个人的得分,让你安排怎么比赛才能使得观众知道冠军的时间最长. 析:贪心,很简单,就是先开始总分高的先出最差劲的,总分低的先出最厉害的,这个题当时实在是读的不明白啊,WA了好多次. ...