Подтвердить что ты не робот

NHibernate-сессия и многопоточность

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

Я использую сеанс nHibernate через шаблон 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 Factory относится к потоковому значению и сохраняет/извлекает сеанс nHibernate для потока. Он работает красиво сейчас;)

4b9b3361

Ответ 1

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

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

Ссылка на NHibernate содержится в разделе 10.2

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

Ответ 2

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

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

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

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