2011-01-20 4 views
3

согласно документации SessionFactory должна быть поточно:ли NHibernate SessionFactory поточно

ISessionFactory является поточно, многие потоки могут получить доступ к нему одновременно и запрос ISessions.

Я смотрю на реализацию, и я не понимаю, как, например, OpenSession() может быть поточно:

http://nhibernate.svn.sourceforge.net/viewvc/nhibernate/trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs?revision=5233&view=markup

Есть несколько замков (звонки), но ничего в OpenSession(). Все безопасные реализации, свободные от блокировки, которые я смог найти, были в основном одиночными.

+3

ThreadSafe! = Using lock/singleton – Paco

ответ

2

OpenSession просто возвращает новый объект и передает его в поля SessionFactoryImpl. Кажется, что эти поля не изменяются ни в каком месте (создайте конструктор), поэтому это кажется потокобезопасным. Необходимым условием является settings.CacheProvider.NextTimestamp() и sessionLocalInterceptor.SetSession(session); также потокобезопасны, поскольку они сильно изменяются в некоторых перегруженных вызовах OpenSession.

Есть место для некоторых условий гонки по крайней мере на. Разместите /.

+0

Невозможно, чтобы первый поток выполнял строку 1126, когда второй поток выполнял строку 1123. Это означало бы, что второй поток перезапишет создание сеанса до первого thread вызывает sessionLocalInterceptor.SetSession (сеанс); – Anonymous

+1

Он не будет перезаписывать переменную, используемую в теле метода. – Paco

+1

@ В стек включены локальные переменные, а стек - поток. – nos

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