我需要在 Java 中编写一个小程序,从 postgreSQL 数据库中读取大量记录,将它们转换为JSON并将其写入别处。
显然,如果我不想获得内存不足错误,我无法同时加载所有记录(500000行)。
在内存中处理1000条记录,处理并转到下一个1000的最佳方法是什么? 有人有想法吗?
答案 0 :(得分:2)
默认情况下,Postgres JDBC驱动程序会将完整的ResultSet
加载到内存中。可以通过设置大于0的提取大小来关闭自动提交并启用基于游标的检索来防止这种情况。
详细信息在手册中:https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor
因此,如果您执行以下操作:
Connection con = ....; // open the connection
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery("select ...");
while (rs.next())
{
// do something with the row
}
这将永远不会将超过1000行加载到内存中。可以通过更改提取大小来控制内存中保存的行数。
我不了解JPA,但控制自动提交应该是直截了当的,但我不知道如何通过JPA控制提取大小。可能还取决于您的JPA提供商。