如何在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启用多任务处理,或者至少使同时运行过程成为可能。
我怎样才能做到这一点?(我找到的大多数链接都在解释这种情况正在发生,但它并没有帮助修复它)。
会话上下文根据您的配置确定,可能在您的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应用程序,您可以为每个请求创建会话。