Как долго можно / нужно держать сеанс NHibernate открытым? - PullRequest
4 голосов
/ 07 августа 2009

Я создал службу Windows, которая прослушивает MSMQ. Для каждого сообщения, которое я получаю, необходимо выполнить некоторые транзакции с БД. Позже может случиться так, что каждую секунду будет появляться 1 сообщение. В настоящее время сеанс Nhib остается открытым, пока служба не будет остановлена ​​вручную. Это хорошая практика или я должен закрывать сессию после каждого сообщения?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 07 августа 2009

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

Документы NHibernate описывают ISession так:

Однопоточный, недолговечный объект, представляющий диалог между приложением и постоянным хранилищем. Оборачивает соединение ADO.NET. Фабрика для ITransaction. Содержит обязательный (первый уровень) кэш постоянных объектов, используемый при навигации по графу объектов или поиске объектов по идентификатору.

Я бы предложил использовать сеанс для разговора, т. Е. Если у вас есть несколько операций дБ, которые «принадлежат друг другу», вы используете один и тот же сеанс для этих операций, но когда эти операции выполнены, вы закрываете сеанс.

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

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

В отличие от фабрики сеансов (ISessionFactory), которая является поточно-ориентированной, вы должны открывать и закрывать сеанс (ISession) с каждой транзакцией базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...