Длинная транзакция в WebSphere 6.1 приводит к OutOfMemoryException - PullRequest
0 голосов
/ 11 апреля 2011

Я запускаю синхронизирующее / пакетное задание (synchronizeXXX (), которое вставляет 111821 записей в базу данных Oracle, используя Hibernate 3.2.5GA / Spring 2.5.6 в одной длительной транзакции (> 4 часа) но происходит сбой примерно через 2 часа / 50000 записей с исключением OutOfMemory.
Хотя я очищаю и сбрасываю каждые 20 вставок, все равно похоже, что Hibernate / Websphere / Spring (?) Держит в сеансе gazillion объектов.

Самое смешное: использование памяти изначально нормальное, но через ок. 20/30 минут использование памяти начинает увеличиваться и увеличивается до тех пор, пока не возникнет OutOfMemory (не отображается в PDF, потому что он был прокручен / очищен или что-то в этом роде). Я пытался обновить Hibernate от 3.2.5 до 3.3.2GA но та же проблема осталась. Когда я увеличиваю максимальный размер кучи, OutOfMemory выходит позже.

Я гуглил и обнаружил некоторые «похожие» проблемы, но они использовали Hibernate для управления транзакцией вместо Spring, поэтому я думаю, что упомянутое исправление не относится ко мне (?). См. Проблемы с симуляцией

Я проанализировал дампы кучи и провел некоторый анализ с IBM Support Agent 4.1. Все результаты / снимки экрана и другие подробности включены в PDF : см. Анализ OutOfMemory (PDF, 586 КБ)

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 апреля 2011

Даже если вы время от времени выполняете очистку и очистку, сеанс Hibernate и транзакция по-прежнему открыты, а очистка не работает должным образом в вашем случае.

Параметры здесь, кажется,:

a) Использовать сеанс без сохранения состояния: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

b) Использовать запросы SQL, чтобы hibernate ничего не мог удержать

c) Использовать несколько транзакций

ТамЭто не лучшее решение, поэтому просто оцените лучший вариант для вас: (

...