Postgresql OutOfMemory с Criteria.scroll () в Hibernate с 2M записями - PullRequest
0 голосов
/ 22 декабря 2009

Я запускаю Criteria.scroll () на PostgreSQL на БД, содержащей 2M записей. Память продолжает расти, и, наконец, она генерирует OutOfMemoryException. Подскажите пожалуйста как это исправить.

Версия БД Postgresql: 8,4 Используемый драйвер Postgresql: postgresql-8.4-701.jdbc4.jar

Есть ли известная проблема с Hibernate scroll () в PostgreSQL?

Ценю любые рекомендации / предложения.

Ответы [ 4 ]

3 голосов
/ 04 января 2012

Вам необходимо периодически вызывать session.clear(), чтобы удалить объекты из сеанса Hibernate. Например:

while(results.next()) {
  processResults(results);
  getSession().clear();
}

Возможно, вы захотите очищать сеанс каждые 100 итераций или около того цикла. Я бы порекомендовал несколько разных способов посмотреть, что лучше.

0 голосов
/ 10 июня 2013

Если это слишком много, вам нужно добавить setFetchSize (XXX) к вашему запросу

0 голосов
/ 23 декабря 2009

Вы должны вызывать System.gc () время от времени (например, каждые 1000 записей, которые вы обрабатываете). Или не выбирайте столько объектов одновременно; используйте методы setMaxResults (int) и setFirstResult (int) для выборки меньших подмножеств данных. Например, 10K записей за раз, затем System.gc (), затем следующий пакет и т. Д.

0 голосов
/ 23 декабря 2009

Я собираюсь догадаться, что это исключение Java OutOfMemoryException, основанное на том, как вы написали имя.

Надеюсь, это не совсем очевидно, ха-ха, но вы получаете ScrollableResults, когда выполняете свой Criteria.scroll (), и я предполагаю, что вы что-то делаете с этими данными, когда вы проходите через них. Вы загружаете каждый элемент в память?

Или вы получаете эту ошибку, просто получая ScrollableResults? Я бы нашел это странным.

...