我有程序 java
客户端和 xmlrpc
服务器和 postgres
数据库,我正在从 2 个数据库中检索数据,
我向服务器发送了 2 个查询,服务器将数据返回给 hashMap
中的客户端。
但数据很大,有时它有超过 40000 行,如果我尝试获取它,我会从服务器收到错误消息:java
heap space
我正在尝试设置 -Xmx1024m 和 -Xmx512m ...
但没有任何好处
现在,修复它的最佳方法是什么?
我通过这段代码获取数据:
Class.forName("org.postgresql.Driver");
String conString = "jdbc:postgresql://" + host + ":" + port + "/" + DBName +
"?user=" + user + "&pass=" + pass;
String conString1 = "jdbc:postgresql://" + host + ":" + port2 + "/" + DBName2 +
"?user=" + user + "&pass=" + pass;
c = DriverManager.getConnection(conString);
c2 = DriverManager.getConnection(conString1);
st = c.createStatement();
st2 = c2.createStatement();
List<ResultSet> resultSets = new ArrayList<>();
resultSets.add(st.executeQuery(query));
resultSets.add(st2.executeQuery(query2));
//ResultSet rs = st.executeQuery(query);
ResultSets rs = new ResultSets(resultSets);
while (rs.next()){
unbArrL.add(rs.getUnbalance("unbalance"));
}
和 ResultSets 类 获取值是:
class ResultSets {
private java.util.List<java.sql.ResultSet> resultSets;
private java.sql.ResultSet current;
public ResultSets(java.util.List<java.sql.ResultSet> resultSets) {
this.resultSets = new java.util.ArrayList<>(resultSets);
current = resultSets.remove(0);
}
public boolean next() throws SQLException {
if (current.next()) {
return true;
}else if (!resultSets.isEmpty()) {
current = resultSets.remove(0);
return next();
}
return false;
}
public Double getUnbalance(String unbalance) throws SQLException{
return current.getDouble("unbalance");
}
}
你能给我明确的解决方案和一些代码或例子吗?
最佳答案
解决此问题的一个明显方法是将结果拆分到不同的页面并使用 LIMIT
和 (OFFSET
)。
如果你真的需要一次输出整个数据集,你应该不用结果填充一个集合,而是返回一个Iterable
(或者仅仅是一个Iterator
,因为您只能对结果集进行一次迭代),它将逐一获取数据库中的行,因为它们是由发出(格式化的)响应的组件请求的。
因此,您需要将查询方法返回的所有 List
替换为 Iterator
并生成 hasNex()
Iterator
的 next()
方法调用底层数据库 ResultSet
中的相应逻辑。
您也可以将原始 SQL ResultSet
一直返回到您的 Controller ,但这将是一个糟糕的关注点分离。
这种方法的最终结果是一次获取一行并将其发送到客户端输出流,因此无论您的查询有多大,您都将拥有恒定的内存占用量。
关于java - Postgres如何获取海量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391844/