Когда открывать / закрывать сеанс гибернации в среде Java EE - PullRequest
1 голос
/ 20 сентября 2011

Открыть в начале запроса http и закрыть в конце, и каждый запрос http обрабатывается в отдельном потоке?

Может быть, полезно сохранить весь сеанс в HashMap и получить к нему статический доступ?

Любая информация, которая объясняет, как работают сеансы гибернации (или какими они на самом деле), полезна.

Ответы [ 3 ]

2 голосов
/ 20 сентября 2011

Если в начале запроса / конце запроса подразумевается http-запрос, то это обычно делается с помощью фильтра сервлетов, который открывает / закрывает сессию для вас.Этот шаблон проектирования называется OpenSessionInView (Filter).Вы можете получить подробности здесь .

Этот шаблон полезен, только если ваше приложение отображается в той же JVM, где существует Hibernate Session.Если ваш уровень доступа к данным находится на другой виртуальной машине Java, чем на уровне рендеринга представления, вам придется (с нетерпением) выбрать все необходимые компоненты модели, прежде чем отправлять запрос на рендеринг представления.

Если вы используете spring (или EJB3), вы можете получить Session (EntityManager), внедренный в ваши классы доступа к данным, поэтому вам не нужно будет вручную работать над открытием и закрытием сеанса.

В идеале вам не нужно вручную открывать / закрывать сеанс/ транзакция (потому что она оставляет шансы пропустить session.close () или tx.commit () и лайки).Вместо этого используйте предоставленный контейнером JPA entitymanager или используйте Spring для управления им.

1 голос
/ 20 сентября 2011

Существует несколько шаблонов использования сеанса, но наиболее распространенным и обычно правильным является открытие и закрытие его при каждом запросе (= поток = единица работы)

В среде JavaEE вы обычно используете JPA. Поэтому используйте hibernate через EntityManager, который может быть добавлен в компоненты (например, EJB или управляемые bean-компоненты cdi) с @PersistenceContext

0 голосов
/ 21 сентября 2011

обычно сеанс открыт, когда требуется доступ к хранилищу данных (например, начинается транзакция).Когда закрывать это имеет разные модели и подходы.Вы можете оставить сеанс открытым в представлениях (jsps).но ты не обязан это делать.

например, один из наших проектов не позволяет использовать фильтр opensessionInView.Таким образом, сессия была закрыта после завершения транзакции.Все данные (в основном объекты Value), которые нужно отправить для просмотра, были загружены перед отправкой.

...