У меня есть программа java
client и xmlrpc
server и postgres
DB, я получаю данные из 2 DB,
Я отправляю 2 запроса на сервер и сервер, возвращая данные клиенту внутри hashMap
.
но данные большие, иногда у него более 40000 строк, и если я пытаюсь получить его, я получаю сообщение об ошибке с сервера: java
heap space
Я пытаюсь установить -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");
}
}
Можете ли вы дать мне четкие решения и некоторый код или примеры?
Одним из очевидных способов обойти эту проблему было бы разделить результат на разных страницах и использовать LIMIT
и (OFFSET
s).
Если вам действительно нужно выводить весь набор данных сразу, вы не должны заполнять коллекцию результатами, а вместо этого возвращать Iterable
(или просто Iterator
, так как вы сможете только итерации наборов результатов один раз), которые будут извлекать строки в БД один за другим, поскольку они запрашиваются компонентом, который испускает (отформатированный) ответ.
Поэтому вам нужно будет заменить весь List
возвращаемый вами методами запросов с помощью Iterator
и заставить hasNex()
и next()
Iterator
вызывать соответствующую логику в базовом DB ResultSet
.
Вы также можете вернуть исходный SQL ResultSet
до вашего контроллера, но это будет плохое разделение проблем.
Конечным результатом этого подхода было бы то, что строки будут извлекаться по одному и отправляться в выходной поток клиента, поэтому у вас будет постоянный объем памяти, независимо от того, насколько огромны ваши запросы.
LIMIT
иOFFSET