我在我的窗口应用程序中使用Spring .Net和Fluent NHibernate,我正在使用多个线程。 我在一些博客和问题中读到每个线程只能有一个会话,而我正在使用HibernateDaoSupport和CurrentSession来完成它:
public class DaoBase<T> : HibernateDaoSupport, IDaoBase<T>
{
protected ISession CurrentSession
{
get { return SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true); }
}
}
但是,我正在测试此功能,并且必须显示每个线程的会话是不同的会话。 我该怎么办?
观测值: 经过一些研究后,我发现通过nhibernate会话获得的对象不能在另一个会话中更改,例如,在“Session 1”中找不到对象,并在“Session 2”中对同一对象进行更新。 但是,在我的测试中,我得到一个第一个线程的对象,并在第二个线程中更新它,这是有效的。什么是错的?
答案 0 :(得分:1)
你已经倒退了 - 一个线程可以拥有它喜欢的NHibernate会话数量。重要的是会话不是设计为线程安全的,因此一次只有一个线程可以在特定会话上运行。
在处理会话之前,对从该会话加载的对象进行操作也会计为“使用会话”,因为它可能会触发延迟加载等。因此,通常只能访问从静止活动会话加载的对象从一个单一的线程。
与任何违反线程安全规则的行为一样,无法保证它会中断。但是没有承诺它也会起作用。
您的测试 您可以让每个线程访问CurrentSession,并将实例放在一些共享集合中,然后测试运行程序线程可以访问会话集合并验证集合中的所有元素都是不同的实例。