Mysql批量大数据获取

栏目: 数据库 · 发布时间: 7年前

内容简介:mysql连接数据库的时候,需要从表中拖数据,如果数据量过大会导致服务内存溢出。会提示java.lang.OutOfMemoryError: Java heap space错误。使用setFetchSize(1000)指定获取接口大小事实上,这种指定的方法是没有任何效果的,服务器还是会一次性取出所有数据放在客户端内存中,此时setFetchSize参数不起作用,当一条SQL返回数据量较大时可能会出现JVM OOM。

mysql连接数据库的时候,需要从表中拖数据,如果数据量过大会导致服务内存溢出。会提示java.lang.OutOfMemoryError: Java heap space错误。

解决方案1

尝试1

使用setFetchSize(1000)指定获取接口大小

ps=conn.con.prepareStatement("select * from bigTable");
    ps.setFetchSize(1000);
复制代码

事实上,这种指定的方法是没有任何效果的,服务器还是会一次性取出所有数据放在客户端内存中,此时setFetchSize参数不起作用,当一条 SQL 返回数据量较大时可能会出现JVM OOM。

尝试2

使用setFetchSize(Integer.MIN_VALUE)

ps = connection.prepareStatement("select * from bigTable",
        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
复制代码

此时客户端会逐个从服务器段获取数据

改进

事实上,setFetchSize(1000)也可以生效的,需要使用useCursorFetch=true

conn = DriverManager.getConnection("jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t");
    stmt = conn.createStatement();
    stmt.setFetchSize(100);
    rs = stmt.executeQuery("SELECT * FROM your_table_here");
复制代码

摘自: https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-implementation-notes.html

解决方案2

通过指定limit/offset,分页读取,这里不再详细叙述。

但是该方法会有一个潜在的问题,如读取重复数据、脏数据,除非在读取之前LOCK表,读取完成后 UNLOCK 表 看到网上的解决方案, 可以通过创建一个临时表解决

CREATE TEMPORARY TABLE AS SELECT..., and read with LIMIT/OFFSET
复制代码

事实上也并不是很好,最好还是通过这种游标取数据。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

信息简史

信息简史

[美] 詹姆斯·格雷克 / 高博 / 人民邮电出版社 / 2013-10 / 69.00元

人类与信息遭遇的历史由来已久。詹姆斯•格雷克笔下的这段历史出人意料地从非洲的鼓语讲起(第1章)。非洲土著部落在尚未直接跨越到移动电话之前,曾用鼓声来传递讯息,但他们是如何做到的呢?后续章节进而讲述了这段历史上几个影响深远的关键事件,包括文字的发明(第2章)、罗伯特•考德里的第一本英语词典(第3章)、查尔斯•巴贝奇的差分机与爱达•拜伦的程序(第4章)、沙普兄弟的信号塔与摩尔斯电码(第5章)。 ......一起来看看 《信息简史》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具