首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres如何获得大量数据

Postgres如何获得大量数据
EN

Stack Overflow用户
提问于 2015-02-08 07:58:18
回答 1查看 223关注 0票数 1

我有程序java客户端和xmlrpc服务器以及postgres DB,我正在从2DB中检索数据,

我向服务器发送了2个查询,服务器在hashMap中将数据返回给客户端。

但是数据很大,有时它有超过40000行,如果我试图获取它,我会从服务器上得到错误:java堆空间。

我试图设置-Xmx1024m and -Xmx512m ...,但没有任何好处。

现在,修复它的最好方法是什么?

我是通过以下代码获取数据的:

代码语言:javascript
复制
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类是:

代码语言:javascript
复制
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");
    }
}

你能给我明确的解决方案和一些代码或例子吗?

EN

回答 1

Stack Overflow用户

发布于 2015-02-08 09:31:35

解决这个问题的一个明显方法是将结果分割到不同的页面中,并使用LIMITs和(OFFSETs)。

如果确实需要同时输出整个数据集,则不应使用结果填充集合,而应返回一个Iterable (或仅返回一个Iterator,因为您只能迭代结果集一次),该结果集将一个接一个地获取DB中的行,因为发出(格式化)响应的组件请求这些行。

因此,您需要将查询方法返回的所有List替换为Iterator,并使IteratorhasNex()next()方法调用底层DB ResultSet中的相应逻辑。

您还可以将原始的SQL ResultSet一路返回到控制器,但这将是一个很差的关注点分离。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28391844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档