Доступ к сеансу NHibernate через несколько потоков - PullRequest
0 голосов
/ 12 октября 2011

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

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

Первоначально я создавал временный сеанс в каждом из этих потоков, чтобы запрашивать объекты из базы данных; Однако я столкнулся с проблемами при доступе к одной из коллекций моего объекта, говоря, что сессия не открыта или была закрыта. У меня есть статический сеанс, который доступен во всем моем приложении Windows, и когда он вызывал GetEnumerator для коллекции, состояние этого сеанса все еще было открыто.

Я полагаю, что это связано с тем, что Intersection, рассматриваемый класс, был загружен из другого сеанса в потоке во время процесса инициализации. Загрузка всех объектов из одной сессии работает нормально; однако время от времени я сталкиваюсь с исключениями из-за ошибок, связанных с использованием сессий без использования потоков.

Тогда у меня такой вопрос. Есть ли способ "слить" сессии в мою глобальную сессию? Что я могу сделать, чтобы установить для класса Intersection открытый сеанс для загрузки коллекции? Является ли проблема, что мне нужно, чтобы открыть сеанс статической глобальной программы сеанса в главном потоке? Или я не смогу организовать загрузку трех разных классов в процессе инициализации в три отдельных потока?

1 Ответ

2 голосов
/ 12 октября 2011

Вы можете связать графы объектов, загруженные с другими сеансами, с основным сеансом.

  • Если объекты могли измениться, то MainSession.Merge(obj), поскольку он загрузит Db-Укажите, что изменилось.

  • Если объекты не изменились, то достаточно MainSession.Lock(obj, LockMode.None), чтобы связать его с основным сеансом.

После этого вы можете использовать объекты, как если бы они были загружены в основной сеанс

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