Предполагая, что вы уже знакомы с XML и самой конфигурацией NHibernate, есть один объект, который вам нужно сделать одноэлементным, а именно ISessionFactory
API. Причина, по которой это должно быть сделано как единое целое, состоит в том, что полная конфигурация в отношении вашего соединения, а также все сопоставления сущностей загружаются в память, чтобы NHibernate знал, как и где сохранить его в базовом хранилище данных. Следовательно, API ISessionFactory
является очень дорогостоящим для реализации.
Что касается сессий, необходимо рассмотреть два аспекта: хотите ли вы сеанс без состояния или с полным состоянием. Этот выбор полностью за вами, но знайте разницу.
API ISession
отслеживает каждое отдельное изменение присоединенного объекта. Присоединенный объект - это объект, который либо был загружен из базового хранилища данных с использованием одного из возможных способов, предоставляемых NHibernate, либо, с другой стороны, временный объект, который только что был создан, и который вы присоединили к сеансу. Поддержание такого полного состояния сеанса для toolong может привести к потере данных, поскольку наступит время утечки этого API в память. Как только происходит утечка, весь трек изменений удаляется, и сеанс больше не может использоваться. API ISession
всегда должен использоваться вместе с API ITransaction
. ITransaction
, скорее всего, совпадает с Begin Transaction
непосредственно в SQL (TSQL, PL / SQL и другие). Каждый раз, когда вам необходимо сохранить базу данных, вы должны делать это во время использования транзакции, чтобы избежать ошибок, отменяющих изменения или что-либо еще. API ISession
должен создаваться в начале единицы работы. Один только ISession
экземпляр API может потребоваться для обработки более чем одной формы одновременно. Тем не менее, создание экземпляра API ISession
синглтоном является действительно очень плохой идеей по причине управления памятью, для которого ISession
отслеживает все изменения, происходящие с присоединенным объектом. Слишком долгое поддержание API ISession
в действии заставит его использовать все больше и больше памяти, что приведет к утечкам памяти и мусору в сеансе.
API IStatelessSession
делает то, что говорит. Будучи без сохранения состояния, он не отслеживает изменения, внесенные в прикрепленный объект. Таким образом, вам придется вручную знать, что нужно сделать как действие против базы данных для этой сущности, которую вы намереваетесь сохранить, скажем так. IStatelessSession
также использует API ITransaction
, с помощью которого он может обрабатывать целостность данных. Они оба всегда должны использоваться вместе при подключении к хранилищу данных. IStatelessSession
часто используется при создании, когда это необходимо, поскольку у него нет другого применения, кроме как «общаться» с хранилищем данных. Я полагаю, что этот API в основном используется в веб-приложениях, где правила без сохранения состояния наиболее распространены.
Как только вы выбрали то, что лучше всего соответствует вашим требованиям между ISession
и IStatelessSesion
API, вы готовы к работе.