Postgres如何获取大量数据

时间:2015-02-08 07:58:19

标签: java postgresql jdbc xml-rpc

我有程序java客户端和xmlrpc服务器和postgres数据库,我正在从2 DB中检索数据,
我已向服务器和服务器发送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");
    }
}

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

1 个答案:

答案 0 :(得分:1)

解决此问题的一个显而易见的方法是将结果拆分为不同的页面并使用LIMIT和(OFFSET s)。

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

因此,您需要将查询方法返回的所有List替换为Iterator s,并制作{hasNex()next()方法Iterator 1}}调用基础数据库ResultSet中的相应逻辑。

您还可以将原始SQL ResultSet一直返回到您的控制器,但这可能是一个很难分离的问题。

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