Управление сеансом NHiernate в Asp.Net
Автор:Eve Cole
Время обновления:2009-06-30 16:46:38
В моем понимании сеанс в NHibernate эквивалентен соединению с базой данных. Поскольку у него также есть методы Open/Close, я не изучал исходный код NHibernate. Интересно, неверно ли это понимание? Я много искал в Интернете информацию об управлении сеансами. Большинство из них — это OpenSession(), когда мне нужны операции с базой данных, и CloseSession() после операции. Это немного похоже на то, когда мы впервые начали изучать ADO.NET. ) объект Connection, а затем Close() после обработки данных. Но это имеет недостаток, поскольку частое переключение Connection потребляет системные ресурсы. Я помню, как раньше делал интерфейс ввода данных, потому что этот интерфейс ввода имел много элементов данных, и множество DropDownLists требовалось для чтения данных в базе данных и их привязки.
Таким образом, в Page_Load страницы методы соответствующих объектов необходимо вызывать один за другим, чтобы получить привязку данных DropDownList из базы данных. Поскольку методы этих наших объектов используют независимые соединения, все они имеют свои. собственное открытие и закрытие соединения. Поэтому открытие этой страницы занимает много времени, что происходит относительно медленно. Позже мы обработали данные, которые необходимо было привязать к DropDownList, в DataSet и привязали DataTable в DataSet к DropDownList. Таким образом, требуется только одно открытие/закрытие соединения. Страница работает намного быстрее.
Поэтому я считаю, что описанный выше метод управления сеансами не очень подходит.
Позже я рассмотрел его управление сессиями в проекте с открытым исходным кодом Cuyahoga, и он использовал модель «сеанс на запрос».
Буквальное понимание заключается в том, что он создает сеанс для каждого запроса до тех пор, пока запрос не будет уничтожен, а затем сеанс будет закрыт.
Подход Кайахоги немного отличается от подхода «сессия на запрос» тем, что он создает объект CoreRepository для каждого запроса. CoreRepository — это класс служб обработки данных, необходимых системе.
Он сначала создал HttpModule (NHSessionModule) для создания объектов CoreRepository и уничтожения объектов CoreRepository следующим образом:
частный void Context_BeginRequest (отправитель объекта, EventArgs e)
{
// Создаем репозиторий для объектов Core и добавляем его в текущий HttpContext.
CoreRepository cr = новый CoreRepository (истина);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
частный void Context_EndRequest (отправитель объекта, EventArgs e)
{
// Закрываем сеанс NHibernate.
если (HttpContext.Current.Items["CoreRepository"] != ноль)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
Таким образом, объект CoreRepository будет автоматически создаваться каждый раз при выполнении запроса. Когда запрос будет завершен, CloseSession() можно использовать для получения объекта CoreRepository через HttpContext.Current.Items["CoreRepository"] в программе.
Таким образом, сеанс в NHibernate управляется в замаскированной форме и достигается модель «сеанс на запрос».
Подробное объяснение: инициализация сеанса Nhibernate путем реализации IHttpModule.
По сравнению с описанным выше методом, который требует создания сеанса для каждой операции, этот метод должен значительно улучшить производительность и скорость.
Затем я подумал: каждый запрос создает сеанс. Можем ли мы также создать пул сеансов, подобный пулу соединений?
Таким образом, вместо того, чтобы создавать сеанс напрямую при каждом запросе, уже созданный сеанс берется из нашего пула сеансов. Разве это не более эффективно? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html