内容简介: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应用之间数据的交互(一)获取系统应用的数据
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Zen of CSS Design
Dave Shea、Molly E. Holzschlag / Peachpit Press / 2005-2-27 / USD 44.99
Proving once and for all that standards-compliant design does not equal dull design, this inspiring tome uses examples from the landmark CSS Zen Garden site as the foundation for discussions on how to......一起来看看 《The Zen of CSS Design》 这本书的介绍吧!