如何在NHibernate会话中启用多线程?

时间:2015-08-21 12:07:12

标签: c# multithreading stored-procedures nhibernate

我用这种方式用param调用过程(通过使用NHibernate会话):

var session = (NHibernate.ISession)GetConnection("BookDataBase");//NHibernate.ISession
var query = session.CreateSQLQuery("exec UpdateBook @BookId=:bookid");
query.SetInt32("bookid", bookId);
query.ExecuteUpdate();

经过this question之后的多次调查,据我了解,NHibernate.ISession被提及为每次请求会话。所以,因为有时我试图同时运行2个程序,首先正常工作,但第二个程序失败

  

交易未连接或已断开连接

所以我需要以某种方式为ISession启用多任务处理,或者至少可以同时执行运行程序。

我怎样才能做到这一点? (我发现的大多数链接都在解释这种情况正在发生,但它没有帮助解决它。)

2 个答案:

答案 0 :(得分:2)

会话上下文根据您的配置确定,可能在您的DI容器中(如果您正在使用任何容器),或者在您自己的包装器类中;因此,如果它不在您的DI contatiner中,那么您可能应该遵循您在问题GetConnection(String databaseName)中提到的函数的代码,您应该能够弄清楚,什么是会话上下文。

会话上下文可以是“Per-request”,“Per-thread”,甚至是应用程序范围内的单例(当然不推荐)。

现在回答你的问题,我无法用你提供的信息确定你是否应该继续在多个线程上使用相同的会话对象(如果你现在就是这种情况),不过我建议你仅在线程上使用每线程会话上下文,并使用会话每请求上下文服务来自UI或API的请求,这些请求不需要很长的处理时间,这样您就可以充分利用会话级别的使用在两种情况下缓存。

答案 1 :(得分:0)

在这种情况下,你应该使用sessionFactory,比如

ISessionFactory sessionFactory = //get the factory
using (session = sessionFactory.OpenSession())
using (tx = session.BeginTransaction())
{
  var query = session.CreateSQLQuery("exec UpdateBook @BookId=:bookid");
  query.SetInt32("bookid", bookId);
  query.ExecuteUpdate();
  tx.Commit();
}

根据您的应用,有很多方法可以实现这一目标。例如,如果它是Web应用程序,您可以为每个请求创建会话。