一个事务中的多个Hibernate会话

时间:2013-05-03 01:57:34

标签: .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个。为了解决这个问题,我想创建短期会话并快速处理它们。

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

1 个答案:

答案 0 :(得分:7)

你可以做的事情

  • session.GetSession()创建具有相同上下文(连接,事务,模式)的子会话
  • 如果您不需要Cascading,请使用适用于此
  • 的StatelessSession
  • 每50个对象后使用session.Clear();