Как заставить NHibernate распознавать изменения в БД, не сделанные через NHibernate - PullRequest
2 голосов
/ 29 октября 2008

Я внедряю NHibernate в существующее веб-приложение. Однако у нас есть некоторые другие процессы, которые выполняют массовую вставку и обновление базы данных. Как я могу уведомить NHibernate о том, что в базе данных происходят изменения, которые не были инициированы через NHibernate?

Большая часть информации, которую я читал об использовании NHibernate в asp.net, упоминала о сохранении объекта Session в HttpContext или CallContext. Затем будет сохранен объект сеанса в течение всего жизненного цикла приложения. Это то, что я реализовал. Я боялся затрат на инициализацию NHibernate при каждом запросе. Разве нет существенного снижения производительности при таком подходе с инициализацией объекта Session для каждого запроса?

Кроме того, имеет ли смысл хранить SessionFactory в HttpContext или CallContext, чтобы сопоставления не приходилось регенерировать при каждом запросе?

Ответы [ 3 ]

12 голосов
/ 29 октября 2008

Ты не должен. Сессии NHibernate предназначены для того, чтобы помочь вам работать в среде ACID, что означает, что одна транзакция не знает ни о каких параллельных транзакциях. Вы должны использовать короткие сессии, которые выполняют небольшие наборы действий. Вы не должны держать сессии открытыми в течение длительных периодов времени. Если вам нужны длительные периоды времени для работы с объектами домена, вам следует отсоединить, а затем повторно присоединить объекты домена к различным сеансам.

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

4 голосов
/ 06 ноября 2008

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

Если вы используете кеширование второго уровня или кеширование запросов, вам может потребоваться очистить кеш вручную. SessionFactory.Evict или SessionFactory.EvictQueries должны помочь в этом. Перезапуск приложения также должен сделать это, но это, вероятно, не тот ответ, который вы ищете.

В приложении ASP.NET общее использование, которое я видел, это создание одного SessionFactory для приложения и создание нового Session для каждого запроса.

SessionFactory требует времени для инициализации, является поточно-ориентированным и требует инициализации только один раз.

Сессии не являются поточно-ориентированными и довольно быстро создаются.

Все, что хранится в HttpContext, будет действительным только для длины запроса. Хранение сеанса в контексте является нормальным и должно дать вам желаемый результат. SessionFactory обычно хранится в статической переменной и будет работать столько же времени, сколько приложение.

См. класс NHIbernateHelper здесь для примера.

4 голосов
/ 29 октября 2008

Вы не должны хранить сессию по нескольким запросам. Плохая, плохая идея.

Практически нет лишних затрат при воссоздании его при каждом вызове. Он должен использовать пул соединений с базой данных - вот где большая часть накладных расходов будет.

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