【问题标题】:using nhibernate sessionfactories in multiple threads在多个线程中使用休眠会话工厂
【发布时间】:2014-07-24 15:29:53
【问题描述】:

我想在多个线程上使用来自 nhibernate 的Isessions。 我读过here 如何实例化工厂,它应该是线程安全的。 我知道 ISession 不是线程安全的,但我打算每个线程只使用一个 ISession。

这样做不起作用:

[Test]
public void TestMultipleThreads(){
  object id;
  using(var session = NHibernateHelper.OpenSession()){
   id = session.Save(new SomeThing("SomeText"));
  };
  Parallel.For(0,2,() =>{
    using (var session =NHibernateHelper.OpenSession()){
       using (var tx=session.BeginTransaction()){
        var something = session.Load<SomeThing>(id);
        Console.WriteLine(something.Text);
      };
    };
  });
}

我无法运行该测试,因此它会打印出 2 个名称。我正在使用 SQLite 和内存数据库。我错过了什么?

如果这不起作用,我应该如何告诉不同的线程使用他们自己的会话?

编辑

我从第一个线程得到消息,第二个线程抛出异常,表未找到。

编辑 2

我认为问题在于数据库的创建。 当我使用新创建的会话创建新表时,我的另一个会话不知道另一个会话。但我会尝试使用其他数据库。

new SchemaExport(config).Execute(true,true,false,session.Connection,null);

【问题讨论】:

  • 您的代码是合法的。应该和sqlite有关。尝试使用另一个数据库

标签: c# multithreading nhibernate fluent-nhibernate


【解决方案1】:

这很可能是因为您在内存数据库中使用 SQLite, 通常当你关闭连接时它就不存在了,

在此示例中,您的数据库似乎在您处理第一个会话时被破坏,以及您保留的数据。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2011-02-01
    • 2015-03-18
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多