Postgresql OutOfMemory с Criteria.scroll () в Hibernate с 2M записями

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

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

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

Цените любые советы / предложения.


person Ankit Kumar    schedule 22.12.2009    source источник
comment
Память в клиентском процессе или на сервере?   -  person Magnus Hagander    schedule 22.12.2009


Ответы (4)


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

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

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

person SingleShot    schedule 03.01.2012

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

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

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

person Arthur Thomas    schedule 22.12.2009

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

person bodtx    schedule 10.06.2013

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

person Chochos    schedule 23.12.2009
comment
Вы никогда не должны вызывать сборщик мусора. Это даже не гарантирует, что он будет работать - это предложение JVM. Не говоря уже о том, что сборщик мусора по умолчанию замораживает все приложение при запуске. Позвольте ему бежать, когда он считает, что ему лучше всего бежать. Наконец, в этом случае это не поможет - сеанс Hibernate удерживает объекты. - person SingleShot; 04.01.2012