Как управлять сессиями NHibernate в долгоживущем приложении Windows Forms? - PullRequest
10 голосов
/ 06 декабря 2008

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 18 января 2009

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

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

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

3 голосов
/ 18 января 2009

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

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

1 голос
/ 24 февраля 2009

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

Первый пост такой

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

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

1 голос
/ 06 декабря 2008

Я вижу пару альтернатив:

  1. Стремление загрузить дерево объектов (которое, из того, что я могу почерпнуть из документации *, по умолчанию )
  2. Отсоедините объекты, перехватите событие «click» и загрузите данные из базы данных с новым сеансом. Это заставляет вас самостоятельно заботиться о коллекциях, вместо того, чтобы полагаться на nhibernate, который может выйти за рамки вопроса (который требует преимуществ NHibernate, одним из которых является управление коллекциями)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...