我需要在一个事务中登记几个NHibernate会话。目前我做以下事情:
1)创建SQL连接dbConn;
2)调用 ISession session = ISessionFactory.OpenSession(dbConn)创建第一个会话;
3)调用 session.BeginTransaction()开始交易。
4)稍后在代码中,我创建了一个具有相同连接的新会话:
ISession session2 = ISessionFactory.OpenSession(dbConn)
当我尝试对session2运行任何查询时,收到以下错误消息:
当分配给命令的连接处于挂起的本地事务中时,ExecuteReader要求该命令具有事务。该命令的Transaction属性尚未初始化。
NHibernate似乎没有在开放事务中登记第二个ISession(或者更具体地,它为该会话创建的Command对象),即使它确实重用了相同的连接。
有没有办法在同一个交易中拥有多个会话?
我无法使用单个会话,因为我有一个长时间运行的任务,可以加载和创建超过100万个对象。如果我使用一个ISession,由于NHibernate Flushes的性能下降,性能会从每秒3000个数据库请求降低到20个。为了解决这个问题,我想创建短期会话并快速处理它们。
但是,整个过程都包含在一个事务中。如果我使用自己的连接创建独立的后续会话,它们会碰撞第一个事务所持有的表锁并冻结。为了解决这个问题,我需要在同一个事务中运行这些会话。
答案 0 :(得分:7)
你可以做的事情
session.GetSession()
创建具有相同上下文(连接,事务,模式)的子会话session.Clear();