1

我在我的窗口应用程序中使用 Spring .Net 和 Fluent NHibernate,并且我正在使用多个线程。我在一些博客和问题中读到每个线程只能有一个会话,我正在使用 HibernateDaoSupport 和 CurrentSession 来做到这一点:

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

但是,我正在测试此功能,并且必须表明每个线程的会话是不同的会话。我该怎么做?

Obs:经过一番研究,我发现通过nhibernate会话获得的对象,不能在另一个会话中更改,例如,无法在“会话1”中找到对象,并在“会话2”中对同一对象进行更新. 但是,在我的测试中,我得到了第一个线程的对象并在第二个线程中更新了它,这是有效的。有什么问题?

4

1 回答 1

1

你把它倒过来了——一个线程可以有多少个它喜欢的 NHibernate 会话。重要的是会话并非设计为线程安全的,因此一次只有一个线程可以对特定会话进行操作。

在处理会话之前,对从该会话加载的对象进行操作也算作“使用该会话”,因为它可能会触发延迟加载等。因此,从仍处于活动状态的会话加载的对象通常只能从单个访问一次线程。

与任何违反线程安全规则的行为一样,不能保证它会中断。但也不能保证它会起作用。

您的测试 您可以让每个线程访问 CurrentSession,并将实例放入某个共享集合中,然后测试运行线程可以访问会话集合并验证集合中的所有元素是否都是不同的实例。

于 2013-08-24T14:02:12.170 回答