jdbc + большой запрос postgresql выдает память - PullRequest
8 голосов
/ 01 октября 2009

Я пытаюсь выполнить запрос postgresql, который возвращает большой результат:

connection.setAutoCommit(false);
st = connection.createStatement(
  ResultSet.CONCUR_READ_ONLY,
  ResultSet.TYPE_FORWARD_ONLY
);
st.setFetchSize(100);
logMemory();
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query ");
logMemory();

но это использует много памяти:

Free memory; 4094347680  (= 3905 mb).
start query 
done query
Free memory; 2051038576  (= 1956 mb).

(печатается с помощью Runtime.getRuntime (). FreeMemory ())

Пока это работает, но база данных будет намного больше. Мне не нужен весь результат в памяти; Мне просто нужно обработать каждую строку, записать результаты на диск и перейти к следующей строке.

Я знаю, что setFetchSize - это только подсказка, но я нахожу странным, если postgresql / jdbc проигнорирует его, так как он существует целую вечность.

Есть ли способ обойти это? Моя единственная идея на данный момент - создать пакетный скрипт, который транслирует результат запроса на диск и затем анализирует файл с Java ...

Ответы [ 2 ]

12 голосов
/ 01 октября 2009

Здесь - это рекомендации, гарантирующие, что набор результатов действительно будет получен с помощью курсора. Похоже, вы ударили по всем известным в вашем коде, но вы не указали оператор, поэтому он может быть несколько соединен с точкой с запятой (маловероятно, по внешнему виду вашего кода). Вы должны использовать протокол V3 (версия 7.4 или новее). Все ли это относится к вашему делу?

7 голосов
/ 02 октября 2009

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

st = connection.createStatement(
  ResultSet.CONCUR_READ_ONLY,
  ResultSet.TYPE_FORWARD_ONLY
);

в

st = connection.createStatement(
  ResultSet.TYPE_FORWARD_ONLY,
  ResultSet.CONCUR_READ_ONLY
);

Может быть, просто

st = connection.createStatement();

также будет работать (поскольку вы удовлетворяли другим критериям для курсора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...