Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 博士后如何获取海量数据_Java_Postgresql_Jdbc_Xml Rpc - Fatal编程技术网

Java 博士后如何获取海量数据

Java 博士后如何获取海量数据,java,postgresql,jdbc,xml-rpc,Java,Postgresql,Jdbc,Xml Rpc,我有程序java客户端和xmlrpc服务器和postgresDB,我正在从2db检索数据, 我向服务器发送了两个查询,服务器在hashMap中向客户端返回数据 但数据很大,有时它有超过40000行,若我试图获取它,我会从服务器得到错误,比如:javaheap space 我试图设置-Xmx1024m和-Xmx512m…,但没有任何好处 现在,最好的解决方法是什么 我通过以下代码获取数据: Class.forName("org.postgresql.Driver"); String con

我有程序
java
客户端和
xmlrpc
服务器和
postgres
DB,我正在从2db检索数据,
我向服务器发送了两个查询,服务器在
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"));
      }
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(构造);
c2=DriverManager.getConnection(构造1);
st=c.createStatement();
st2=c2.createStatement();
列表结果集=新建ArrayList();
add(st.executeQuery(查询));
结果集.add(st2.executeQuery(query2));
//结果集rs=st.executeQuery(查询);
结果集rs=新结果集(结果集);
while(rs.next()){
不平衡加上(不平衡量(“不平衡量”);
}
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");
    }
}
类结果集{
私有java.util.List结果集;
私有java.sql.ResultSet当前;
公共结果集(java.util.List结果集){
this.resultSets=newjava.util.ArrayList(resultSets);
当前=结果集。删除(0);
}
public boolean next()引发SQLException{
if(current.next()){
返回true;
}如果(!resultSets.isEmpty()),则为else{
当前=结果集。删除(0);
返回next();
}
返回false;
}   
公共双GetDistribution(字符串不平衡)引发SQLException{
返回电流。getDouble(“不平衡”);
}
}

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

解决这个问题的一个明显方法是将结果分成不同的页面,并使用
限制
和(
偏移量
s)

如果确实需要一次输出整个数据集,则不应使用结果填充集合,而应返回一个
Iterable
(或者仅返回一个
迭代器,因为您只能对结果集进行一次迭代),该迭代器将逐个提取数据库中的行,当它们被发出(格式化)响应的组件请求时

因此,您需要将查询方法返回的所有
列表
替换为
迭代器
s,并使
迭代器
hasNex()
next()
方法调用底层数据库
结果集
中的相应逻辑

您还可以将原始SQL
ResultSet
一直返回到控制器,但这会导致关注点分离不良


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

使用
限制
偏移量
使用基于光标的结果集,否则所有内容都将加载到内存中。文档中有详细说明:是否真的需要将所有数据保存在ram中?为何向用户显示40000行似乎不是一个好主意。可以在语句实例上设置setMaxRows。或者在sql中使用适当的where筛选器。或者,您可以在光盘上缓冲数据。