正常情况下MySQL的JDBC是不支持setFetchSize()方法设置的,总是一次性全部抓取到内存中,导致内存溢出。可以通过分页抓取以降低内存开销,过多的分页会导致查询效率降低。当然,程序也会变得更加复杂。
为了能够使JDBC自动以流的方式进行数据抓取,可以按如下设置:
statement.setFetchSize(Integer.MIN_VALUE);
有人认为是MySQL的一个BUG,详情见:http://bugs.mysql.com/bug.php?id=18148
另外,按文章提到,可以尝试在JDBC的URL上加上参数"useCursorFetch=true"。如此,可以按setFetchSize指定的数量批量抓取数据,只支持MySQL 5.0 以上的Server/Connector。推荐以此方式解决这个问题。