Ссылка на локальный поток для сеанса hibernate impl, в результате чего сеанс impl не получает сборщик мусора - PullRequest
0 голосов
/ 10 сентября 2010

Я использую локальный поток для управления своими сессиями гибернации. Недавно я видел исключения OutOfMemory на моем производственном сервере. Я запустил Eclipse MAT для heap_dump и увидел, что многие мои сеансы не собирают мусор, даже если они закрываются из-за того, что на них ссылается объект ThreadWithAttributes. Это сводит меня с ума, сейчас я видел много постов с похожими вопросами на разных форумах, но без ответов. Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 сентября 2010

спасибо за ваш ответ. В настоящее время я использую открытую сессию в представлении, используя getCurrentSession (), что означает, что сессия для каждого запроса закрывается на транзакции. Я вижу, что сеансы закрываются (хотя и не обнуляются), но каким-то образом класс ThreadWithAttributes tomcat содержит ссылку на sessionImpl, предотвращая его сборку мусора. Это происходит с каждым потоком. Моя база данных довольно большая, так что это приводит к ошибкам памяти через несколько часов или не более одного дня, и сервер должен быть восстановлен.

0 голосов
/ 10 сентября 2010

Если вы используете Hibernate Sessions в веб-приложении, НЕ позволяйте объектам Session в ThreadLocal оставаться там между запросами - так как у вас все равно нет контроля над потоками, они принадлежат контейнеру.

Если вам нужно создать и закрыть сеанс на время существования веб-запроса, и вы не хотите передавать объект Session повсюду, вам следует подумать о написании ServletFilter для выполнения очистки - он будет вызываться по всему каждый запрос. Вы также можете разрешить этому фильтру фиксировать или откатывать любые транзакции, которые вы, возможно, начали.

Вы должны прочитать эту страницу для простого рецепта, как это сделать: http://community.jboss.org/wiki/OpenSessioninView

...