Сессия nHibernate и многопоточность - PullRequest
12 голосов
/ 28 октября 2008

У меня был метод с большим количеством постоянных вызовов, который использовал сеанс nHibernate, он работал, все в порядке. Но мне нужно было реорганизовать этот метод, извлекая метод из содержимого внутри цикла, по многопоточным причинам. Затем я создал класс с этим методом. Это похоже на обычный рефакторинг, но сеанс nHibernate внутри этого вызова метода прерывается, без контекста, я не завершал его в любой момент. Есть проблемы с nHibernate с многопоточностью? Даже если у меня выполняется только один поток, у меня та же проблема.

Я использую nHibernate Session через шаблон SessionFactory и Façade, это означает, что сеанс не является полем этих объектов, он глобален в SessionFactory.


Делаем это немного более понятным:

ДО:

Method()
{
... persistence calls
foreach(Thing..)
{
...persistence calls for each thing (1)
}
...
}

ПОСЛЕ:

Method()
{
... persistence calls
foreach(Thing..)
{
create a thingResolver object with some data
open a new thread with thingResolver.Method (1)
starts this thread
}
.. waits for finishing threads and continues
}

Наша фабрика сессий nHibernate поддерживает потоки и сохраняет / получает сессию nHibernate для каждого потока. Сейчас работает хорошо;)

Ответы [ 2 ]

17 голосов
/ 28 октября 2008

Сеансы не являются поточно-ориентированными в NHibernate по дизайну . Так что все должно быть в порядке, если у вас есть сеанс , используемый только одним потоком .

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

Ссылка на NHibernate есть в разделе 10.2

http://nhibernate.info/doc/nh/en/index.html#transactions

0 голосов
/ 09 января 2011

У вас может быть один NHibernate SessionFactory для нескольких потоков, если у вас есть отдельный сеанс NHibernate для каждого потока.

Вот пример, который выдаст исключения, потому что он использует один и тот же сеанс для каждого потока:

https://forum.hibernate.org/viewtopic.php?p=2373236&sid=db537baa5a57e3968abdda5cceec2a24

Решение состоит в том, чтобы хранить сеансы в LocaldataStoreSlot, таким образом, вы можете иметь модель сеанса для запроса.

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