【问题标题】:Spring.Net / NHibernate - Multi ThreadingSpring.Net / NHibernate - 多线程
【发布时间】:2013-08-23 18:47:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate spring.net nhibernate-configuration


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多