我正在尝试执行一个返回大结果的postgresql查询:
connection.setAutoCommit(false);
st = connection.createStatement(
  ResultSet.CONCUR_READ_ONLY,
  ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(100);
logMemory();
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query ");
logMemory();
但这会占用大量内存:
Free memory; 4094347680  (= 3905 mb).
start query 
done query
Free memory; 2051038576  (= 1956 mb).
(使用Runtime.getRuntime()打印.freeMemory())
到目前为止,它的工作原理,但数据库将会更大.我不需要记忆中的整个结果; 我只需要处理每一行,将结果写入磁盘并转到下一行.
我知道'setFetchSize'只是一个提示,但是如果postgresql/jdbc会忽略它,我会觉得很奇怪,因为它已经存在了很长时间.
有办法解决这个问题吗?到目前为止,我唯一的想法是创建一个批处理脚本,将查询结果流式传输到磁盘,然后从Java解析文件...
哎呀,这是我见过的最讨厌的错误之一.你应该改变
st = connection.createStatement(
  ResultSet.CONCUR_READ_ONLY,
  ResultSet.TYPE_FORWARD_ONLY
);
成
st = connection.createStatement(
  ResultSet.TYPE_FORWARD_ONLY,
  ResultSet.CONCUR_READ_ONLY
);
也许只是
st = connection.createStatement();
也会工作(因为你已经满足了游标的其他标准).