сеанс 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 поток-осведомлена, и хранит / извлекает nHibernate сеанс в потоке. Теперь он работает хорошо;)

2 ответов


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

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

ссылка NHibernate имеет его в разделе 10.2

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


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

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

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

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