1

Я использую Spring .Net и Fluent NHibernate в своем оконном приложении, и я работаю с несколькими потоками. Я читал в некоторых блогах и вопросов, которые могут быть только один сеанс для каждого потока, и я использую HibernateDaoSupport и CurrentSession сделать это:Spring.Net/NHibernate - Multi Threading

public class DaoBase<T> : HibernateDaoSupport, IDaoBase<T> 
    { 
     protected ISession CurrentSession 
     { 
      get { return SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true); } 
     } 
} 

Однако я тестирую эту функцию и должны показать, что сеансы каждого потока - это разные сеансы. Как я могу это сделать?

Обследование: После некоторых исследований я обнаружил, что объекты, полученные с помощью сеанса nhibernate, не могут быть изменены в другом сеансе, например, не могут найти объект в «сеансе 1» и дать обновление на том же объекте в «Сессия 2». Но в моих тестах я получаю объект с первым потоком и обновляю его во втором потоке, это работает. Что случилось?

ответ

1

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

До тех пор, пока сеанс не был удален, работа над объектом, загруженным с этого сеанса, также считается «работающим с сеансом», поскольку она может запускать ленивые нагрузки и т. Д. Таким образом, объекты, загруженные из все еще активного сеанса, обычно должны быть только доступ через один поток за раз.

Как и при любом нарушении правил безопасности нитей, нет гарантии, что он сломается. Но нет никакого обещания, что это сработает.

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