我有程序java客户端和xmlrpc服务器以及postgres DB,我正在从2DB中检索数据,
我向服务器发送了2个查询,服务器在hashMap中将数据返回给客户端。
但是数据很大,有时它有超过40000行,如果我试图获取它,我会从服务器上得到错误:java堆空间。
我试图设置-Xmx1024m and -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");
}
}你能给我明确的解决方案和一些代码或例子吗?
发布于 2015-02-08 09:31:35
解决这个问题的一个明显方法是将结果分割到不同的页面中,并使用LIMITs和(OFFSETs)。
如果确实需要同时输出整个数据集,则不应使用结果填充集合,而应返回一个Iterable (或仅返回一个Iterator,因为您只能迭代结果集一次),该结果集将一个接一个地获取DB中的行,因为发出(格式化)响应的组件请求这些行。
因此,您需要将查询方法返回的所有List替换为Iterator,并使Iterator的hasNex()和next()方法调用底层DB ResultSet中的相应逻辑。
您还可以将原始的SQL ResultSet一路返回到控制器,但这将是一个很差的关注点分离。
这种方法的最终结果将是每次获取一个行并发送到客户端输出流,因此无论查询有多大,您都将有一个恒定的内存占用。
https://stackoverflow.com/questions/28391844
复制相似问题