mysql链接数据库的时候,须要从表中拖数据,若是数据量过大会致使服务内存溢出。会提示java.lang.OutOfMemoryError: Java heap space错误。html
使用setFetchSize(1000)指定获取接口大小java
ps=conn.con.prepareStatement("select * from bigTable");
ps.setFetchSize(1000);
复制代码
事实上,这种指定的方法是没有任何效果的,服务器仍是会一次性取出全部数据放在客户端内存中,此时setFetchSize参数不起做用,当一条SQL返回数据量较大时可能会出现JVM OOM。mysql
使用setFetchSize(Integer.MIN_VALUE)sql
ps = connection.prepareStatement("select * from bigTable",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
复制代码
此时客户端会逐个从服务器段获取数据数据库
事实上,setFetchSize(1000)也能够生效的,须要使用useCursorFetch=truebash
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
服务器
经过指定limit/offset,分页读取,这里再也不详细叙述。ui
可是该方法会有一个潜在的问题,如读取重复数据、脏数据,除非在读取以前LOCK表,读取完成后 UNLOCK 表 看到网上的解决方案, 能够经过建立一个临时表解决spa
CREATE TEMPORARY TABLE AS SELECT..., and read with LIMIT/OFFSET
复制代码
事实上也并非很好,最好仍是经过这种游标取数据。code