2010-04-26 3 views
1

Мы используем NHibernate в богатом клиентском приложении. Это довольно открытое приложение (пользователь ищет набор данных или создает новый, меняет данные и сохраняет набор данных. Мы оставляем сессию открытой, потому что иногда нам приходится ленить загружать некоторые свойства объекта (вложенный объект структура).NHibernate/несколько сеансов и вложенных объектов

Это означает, что одна большая проблема

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

Итак - возможно ли повторное подключение сеанса к новому соединению с базой данных?

Другая проблема

  • можно ли получить объект из одной сессии, а затем вновь присоединить ее к другой сессии? (Я часто слышу, что session.lock должен работать для этого - но это не так хорошо работает в нашем приложении - поэтому я закончил тем, что получил «свежий» объект из сеанса и скопировал данные вручную - что немного громоздкий)

Любые идеи для этого?

+1

1. Вы должны попытаться выяснить, почему соединение не управляется должным образом. Возможно, у вас будет такая же проблема и в других частях кода. Объекты сеанса могут подключаться, и это соединение несколько раз само по себе в нормальной ситуации. 2. Это звучит как странный дизайн приложения с неправильным использованием ленивой загрузки. Можете ли вы объяснить, почему вы это делаете? Или это первый раз, когда вы пытаетесь NHibernate? – Paco

+1

Я согласен с Пако в ленивой проблеме с нагрузкой. Вы делитесь своим экземпляром ISession между запросами? – jfneis

+0

хорошо - похоже, наш дизайн приложения испорчен. Спасибо за ваши советы. Мы заполняем представление данными из модели, но позже пользователь хочет создать отчет (и нужны данные, которые не показаны) - поэтому мы оставили сессию открытой и ленив загрузили отсутствующие данные. Похоже, что лучше получить новый объект из db и использовать его. – bernhardrusch

ответ

0

Итак, теперь я начал менять наш дизайн приложения - на данный момент похоже, что это стоит изменить.

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

Нет проблем с закрытыми соединениями.

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