java - 从大表中检索所有记录时如何避免 OOM(内存不足)错误?

标签 java sql out-of-memory large-data-volumes

我的任务是将一个巨大的表格转换为自定义 XML 文件。我将使用 Java 来完成这项工作。

如果我简单地发出“SELECT * FROM customer”,它可能会返回大量数据,最终导致 OOM。我想知道,有没有一种方法可以在记录可用后立即处理记录,然后在 sql 检索过程中从内存中删除记录?

--- 2009 年 7 月 13 日编辑

让我详细说明我的问题。我有 1 个数据库服务器和 1 个应用程序服务器。 当我在应用程序中发出选择查询时,数据将从数据库服务器传输到应用程序服务器。

我相信(如果我错了请纠正我)ResultSet 需要等到收到查询中的所有记录。即使我们将 fetch size 设置为 4,对于 1000 条记录的表,我们最终在应用服务器的堆内存中仍然有 1000 条记录,对吗?获取大小只影响往返数据库服务器的次数。

我的问题是,如何在到达应用服务器后立即开始处理这 4 条(或任意数量的)记录,并处理它以释放应用服务器中的内存?

最佳答案

有了更多的信息,我可以获得更有帮助的答案。

如果您使用的是 MySQL:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
       java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

来自 http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html :

java.util.Properties info = new java.util.Properties();
info.put ("user", "scott");
info.put ("password","tiger");
info.put ("defaultRowPrefetch","15");
getConnection ("jdbc:oracle:oci:@",info);

关于java - 从大表中检索所有记录时如何避免 OOM(内存不足)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1107732/

相关文章:

sql - 谷歌云 SQL 第二代 -> "Aborted connection"

java - Spring 3.1, hibernate 4,SessionFactory

java - 多态性、转换为对象和类型删除

java - Android Digits 不返回任何内容

c# - Linq-to-SQL 检索子表抛出 InvalidCastException

android - 如何在 Android 中加载大图像并避免内存不足错误?

java - 为什么老年代对象会被小 GC 清除

mysql - 如何在同一查询中的一个表中获取不同类型表中的行数

MongoDB MongoError : Out of memory

xcode - “打开的文件太多”错误 xcode