一个Transanction中的多个NHibernate会话

Ale*_*lex 5 .net sql nhibernate

我需要在一个事务中登记几个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个.为了解决这个问题,我想创建短期会话并快速处理它们.

但是,整个过程都包含在一个事务中.如果我使用自己的连接创建独立的后续会话,它们会碰撞第一个事务所持有的表锁并冻结.为了解决这个问题,我需要在同一个事务中运行这些会话.

Fir*_*iro 7

你可以做的事情

  • session.GetSession() 使用相同的上下文创建子会话(连接,事务,模式)
  • 如果你不需要级联使用StatelessSession,这是为了这个
  • session.Clear();每50个对象左右后使用