2008-12-05 4 views
10

Мы используем NHibernate для управления нашей настойчивостью в сложном модульном приложении для форм Windows, но одна мысль меня беспокоит. В настоящий момент мы открываем сеанс по запуску и открываем все объекты через этот сеанс. Меня беспокоит, что все загруженные объекты загружаются в кеш сеанса NHibernate, поэтому они не могут быть собраны в мусор, и в конечном итоге мы получим всю базу данных в памяти.Как управлять сеансами NHibernate в долговременном приложении Windows Form?

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

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

Что читают читатели StackOverflow, чтобы сохранить преимущества NHibernate без проблем, которые я описываю?

ответ

1

я могу увидеть пару альтернатив:

  1. Нетерпеливый нагружать дерево объектов (которые, от того, что я могу собрать из documentation по умолчанию)
  2. Отделить объекты, перехватывать «мыши ", и загрузите данные из базы данных, затем, с новым сеансом. Это заставляет вас заботиться о коллекциях самостоятельно, вместо того, чтобы полагаться на nhibernate, что может выходить за рамки вопроса (в котором говорится о преимуществах NHibernate, одним из которых является управление коллекциями)
4

Айенде и компания обычно рекомендуют использовать сеанс за «беседу». Обычно это приводит к тому, что продолжительность сеанса длится очень коротких операциях, поэтому он больше похож на веб-приложение.

Для вашего древа дерева вы можете использовать решение № 2 Бруно просто отлично. Объекты могут быть ленивыми. Затем каждый раз, когда вам нужно получить доступ к дочерней коллекции, вы начинаете разговор и повторно подключаете родителя через ISession.Lock. Затем, когда привязка данных завершена, закройте эту сессию. Не слишком много накладных расходов для поддержания, всего несколько строк кода в любой форме, которая должна вести беседу; вы можете расширить форму и элементы управления, которые вы используете, чтобы сделать это автоматически, если вы чувствуете себя нахальным.

Таким образом, сложная часть - это одновременные изменения из разных сеансов. Не пойдем!

+1

Вот статья с хорошим примером того, как реализовать сеанс для разговора в приложении для рабочего стола: http://msdn.microsoft.com/en-us/magazine/ee819139.aspx – 2010-07-20 23:28:56

3

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

Более конкретно, например, если у меня есть форма, которая позволяет мне редактировать информацию о клиенте, например, я открою сеанс при создании экземпляра формы, и я закрою сеанс, когда форма будет закрыта. Когда у меня есть 2 экземпляра этой формы, у меня также есть 2 сеанса.

1

Вы посмотрите на мои посты о том, как использовать uNHAddins для работы с сессией на разговор в Windows, можете Forms приложение (uNHAddins проект с некоторым additionsns к NHibernate во главе с Фабио Maulo, ток NH Lead)

Первый пост это

http://gustavoringel.blogspot.com/2009/02/unhaddins-persistence-conversation-part.html

Оттуда вас есть ссылки на ствол uNHAddins.

Смежные вопросы