内容简介: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 复制代码
事实上也并不是很好,最好还是通过这种游标取数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ADO.NET获取数据(DataSet)同时获取表的架构实例
- Oracle获取列数据大小
- sqlserver数据库获取数据库信息
- dva 如何异步获取接口数据
- beego获取ajax数据的实例
- Android应用之间数据的交互(一)获取系统应用的数据
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MATLAB智能算法/科学与工程计算技术丛书
编者:温正//孙华克 / 清华大学 / 2017-09-01 / 89.0
一起来看看 《MATLAB智能算法/科学与工程计算技术丛书》 这本书的介绍吧!