当我试图读取一个巨大的列表时,我的内存不足。这是崩溃服务器的代码
query = "SELECT * FROM huge_list ORDER BY id ASC";
statement = this.database.createStatement();
results = statement.executeQuery(query);
这是错误
线程中的异常"线程-2" java.lang.OutOfMemoryError:Java堆空间
错误指向结果行。关于如何避免这种情况的任何建议?也许使用Limit加载列表?列表的大小会导致错误吗?
答案 0 :(得分:1)
您可以更改jvm的内存设置,这可以解决您的问题,但通常您不应该一次加载所有数据。更好的加载总是让我们说100行,然后查询接下来的100行。
为了安全起见,我会再次存储最小的ID和查询,限制下一个行的早午餐。因此,如果添加新行,这不会破坏您的逻辑。
答案 1 :(得分:0)
我相信你应该流式传输MySQL结果。见Reading large amount of records MySQL into Java
您的另一个选择是增加JVM允许的最大RAM,但这可能不是您想要做的。
答案 2 :(得分:0)
尝试修改查询以仅返回您正在向用户显示/处理的记录。您可以使用limit by子句。还有一件事要说明你的列名,SELECT *并不是真正需要的,你真的在处理查询返回的所有列吗?