gpt4 book ai didi

java - Postgres如何获取海量数据

转载 作者:行者123 更新时间:2023-11-29 13:28:54 24 4
gpt4 key购买 nike

我有程序 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() Iteratornext() 方法调用底层数据库 ResultSet 中的相应逻辑。

您也可以将原始 SQL ResultSet 一直返回到您的 Controller ,但这将是一个糟糕的关注点分离。

这种方法的最终结果是一次获取一行并将其发送到客户端输出流,因此无论您的查询有多大,您都将拥有恒定的内存占用量。

关于java - Postgres如何获取海量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com