目前我在java中使用statement.executeQuery(qStr)
从mysql中选择大量数据。不幸的是,java在statement.executeQuery(qStr)
语句中的内存不足,异常为java.lang.OutOfMemoryError: Java heap space
。我想知道是否有一种从mysql流加载数据的方法。这样我可以通过trunk来处理选定的数据中继,以避免内存不足?
请注意:我正在使用eclipse,这个post向我展示了如何增加java在Eclipse中使用的堆内存。但在我遵循它的方法之后,我仍然遇到同样的问题。
提前致谢。
答案 0 :(得分:1)
是的,您可以将Statement上的FetchSize设置为Integer.MIN_VALUE,ResultSet应该是 TYPE_FORWARD_ONLY也是如此,虽然我认为这是默认的.. MySQL专门处理它并启用ResultSet的流式传输,而不是将其全部读入内存,它记录在案here
PreparedStatement stmt =
conn.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
答案 1 :(得分:1)
默认情况下,ResultSet完全检索并存储在内存中。如果您正在处理大量结果集,那么您的堆将很快耗尽。您可以通过创建如下所示的Statement实例来更改此行为:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这会创建一个
仅向前,只读结果集,其提取大小为Integer.MIN_VALUE,用作驱动程序逐行传输结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。
有关更多详细信息和警告,请参阅MySQL文档: http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html