Hibernate сессия и сборщик мусора - PullRequest
2 голосов
/ 31 августа 2009

Объект с элементом данных сеанса hibernate при сборке мусора, закрыто ли соединение jdbc сеанса? Другими словами, плохая идея оставить закрывающий сеанс сборщиком мусора?

Ответы [ 3 ]

2 голосов
/ 31 августа 2009

Вы всегда должны явно закрывать ресурсы и не полагаться на GC / финализацию.

0 голосов
/ 31 августа 2009

Если ваши сущности собирают мусор, нет смысла собирать и сеанс. Сессия будет GCed тогда или позже.

Например, если я сохраню ссылку на сеанс в статическом списке, я могу часами запускать свое приложение, объекты будут собираться, но не сеансы ...

Сессия должна быть закрыта явно.


Если вам не нравится явное закрытие в вашем коде, я полностью согласен с вами и многими другими людьми. : -)

Распространенным решением является выполнение закрытия в коде фреймворка, то есть в коде, который написан один раз и применяется ко всем вашим транзакциям. Это может произойти в суперклассе, например, если все ваши транзакции реализованы с помощью шаблона команды.

Однако наиболее распространенный шаблон реализации - это использование AOP для решения такой глобальной проблемы. В наших проектах используется Spring, который предоставляет готовую поддержку для закрытия всех сеансов гибернации (и связанной транзакции) с дополнительной функцией для commit / rollback :

  • если выдается исключение, для транзакции вызывается откат до закрытия
  • в противном случае вызывается commit.
0 голосов
/ 31 августа 2009

полностью согласен с @Robert. Это не может быть подчеркнуто достаточно, объекты сеанса гибернации должны обрабатываться с той же тщательностью, что и соединение JDBC, вы должны знать, когда и где оно открыто, а когда и где оно закрыто во всех случаях.

Это, конечно, одна из причин, по которой люди считают Spring очень полезной, она предоставляет очень полную структуру для управления жизненным циклом ресурсов, таких как соединения jdbc и сеансы гибернации.

...