Postgres Как я могу получить огромные данные

1

У меня есть программа 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");
    }
}

Можете ли вы дать мне четкие решения и некоторый код или примеры?

  • 0
    используйте LIMIT и OFFSET
  • 1
    Используйте набор результатов на основе курсора, иначе все будет загружено в память. Подробности в документации: jdbc.postgresql.org/documentation/94/…
Показать ещё 1 комментарий
Теги:
jdbc
xml-rpc

1 ответ

1

Одним из очевидных способов обойти эту проблему было бы разделить результат на разных страницах и использовать LIMIT и (OFFSET s).

Если вам действительно нужно выводить весь набор данных сразу, вы не должны заполнять коллекцию результатами, а вместо этого возвращать Iterable (или просто Iterator, так как вы сможете только итерации наборов результатов один раз), которые будут извлекать строки в БД один за другим, поскольку они запрашиваются компонентом, который испускает (отформатированный) ответ.

Поэтому вам нужно будет заменить весь List возвращаемый вами методами запросов с помощью Iterator и заставить hasNex() и next() Iterator вызывать соответствующую логику в базовом DB ResultSet.

Вы также можете вернуть исходный SQL ResultSet до вашего контроллера, но это будет плохое разделение проблем.

Конечным результатом этого подхода было бы то, что строки будут извлекаться по одному и отправляться в выходной поток клиента, поэтому у вас будет постоянный объем памяти, независимо от того, насколько огромны ваши запросы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню