2008-10-28 2 views
12

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

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

ответ

17

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

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

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

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

+0

спасибо Aleksey. У меня будут проблемы с этим (работа с другим сеансом), так как это нарушает мой дизайн, я думаю о том, чтобы сжечь эту многопоточную вещь. –

+0

Фактически, моя фабрика сеансов является надежной и может выполнять сеанс на поток, его работа: D –

+1

Обновленная ссылка на документацию http://nhforge.org/doc/nh/en/index.html#transactions – AlfeG

0

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

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

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

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

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