Подтвердить что ты не робот

Какова должна быть продолжительность сеанса NHibernate?

Я новичок в NHibernate и видел некоторые проблемы при закрытии сессий преждевременно. Я решил это временно, повторно используя сеансы вместо открытия сеанса за транзакцию. Тем не менее, у меня создалось впечатление, что открытие сессий каждый раз, когда вы в них нуждаетесь, является рекомендуемым подходом к управлению жизненным циклом сеанса. Нет?

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

Edit:

Обратите внимание, что моя архитектура приложения - это настольное приложение, взаимодействующее с серверной службой, и это то, что делает вся обработка базы данных, используя NHibernate + Fluent. (Если это имеет значение...)

4b9b3361

Ответ 1

Вам нужна стратегия управления сеансом, которая позволяет вашему приложению эффективно функционировать и использовать то, что дает вам NHibernate - особенно кэширование и ленивая загрузка.

Создание сеансов - это недорогой процесс и требует небольшого количества оперативной памяти или процессора, поэтому вам не стоит беспокоиться о сохранении или повторном использовании сеансов (действительно, повторное использование их может привести к некоторым неприятным и непредвиденным побочным эффектам, последствия). Сеанс factory является дорогостоящим и должен быть создан один раз и только один раз при запуске приложения.

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

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

В вашем случае с сервисом (я предполагаю, что он работает как служба Windows), выполняя работу NHibernate, возможно, вы захотите рассмотреть возможность создания сеанса для каждого нового запроса из приложения для настольных компьютеров, и утилизации, когда этот запрос обслуживается. Не зная точно, как работает ваш сервис и какой механизм использует настольное приложение для обсуждения (удаленный? WCF? Обычный старый SOAP?) Я не могу быть более конкретным.

(Есть некоторые исключения из этого общего правила - предположим, что у вас есть набор постоянных объектов, которые представляют общий ресурс, к которому будет ссылаться другой код, но не изменяющийся, вы можете загрузить их перед запуском приложения и оставить их отключен с этого момента.)

Если вы обнаружите, что производительность вялена в такой стратегии, возможно, вы слишком много разговариваете с базой данных, а ваш граф объектов является сложным; посмотрите кэширование второго уровня в этом случае.

Ответ 2

В веб-приложении у вас должен быть один сеанс для каждого запроса. Это дает вам полный контроль над временем жизни сеанса и упрощает обработку ошибок.

В настольном приложении я рекомендую использовать сеанс на презентаторе (или форму, если хотите). Чтобы процитировать Айенде в его статье MSDN Magazine:

Рекомендуемая практика для рабочего стола приложения - использовать сеанс за формы, так что каждая форма в приложение имеет свою собственную сессию. каждый форма обычно представляет собой часть работы, которую пользователь хотел бы для выполнения, поэтому совпадающий сеанс срок службы до срока службы формы довольно хорошо на практике. Добавленный польза в том, что у вас больше нет проблема с утечками памяти, потому что когда вы закрываете форму в приложения, вы также избавляетесь от сессия. Это сделало бы все объекты, загруженные сессии, имеющей право на сборщик мусора (GC).

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

Ответ 3

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

Ответ 4

Нет ответа на все ситуации. Сессия 13 из Summer of Nhibernate представляет собой хороший обзор проблемы.

Ответ 5

Большая часть инфраструктуры NHibernate и Microsoft Entity Framework Microsoft ADO.NET аналогичны. Вот очень хорошая статья о том, как вы должны контролировать жизненный цикл ObjectContext в ADO.NET EF.

http://blogs.msdn.com/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext.aspx

Он также должен применяться к сеансам NHibernate.