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

本文关键字:启用 多线程 会话 NHibernate | 更新日期: 2023-09-27 18:09:10

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

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

在对这个问题进行了几次调查之后,据我所知,NHibernate.ISession提到的是会话/请求。所以,因为有时我试图同时运行两个过程,第一个工作正常,但第二个失败

事务未连接或已断开

所以我需要以某种方式为issession启用多任务处理,或者至少使同时运行过程成为可能。

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

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

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

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

现在回答你的问题,我不能确定,你只提供了信息,是否应该继续使用相同的会话对象在多个线程(如果这是你现在的情况),但是我建议你使用一个session-per-thread在线程上下文,和使用session-per-request上下文服务请求通过UI或API不需要较长的处理时间,这样你将从会话的使用水平缓存。

在本例中,您应该使用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应用程序,您可以为每个请求创建会话。