我想在多个线程中使用来自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
我认为Prolem在于创建数据库。 当我使用新创建的会话创建新表时,我的其他会话不知道其他会话。但我会尝试使用其他数据库。
new SchemaExport(config).Execute(true,true,false,session.Connection,null);
答案 0 :(得分:1)
这很可能是因为你在内存数据库中使用SQLite, 通常在关闭连接时不再存在,
在这个例子中,当你处理第一个会话以及你持久存储的数据时,你的数据库似乎被破坏了。