一个事务中使用多个NHibernate会话

5
我需要在一个事务中注册多个NHibernate会话。目前我是这样做的:
1. 创建SQL连接dbConn; 2. 调用ISessionFactory.OpenSession(dbConn)创建第一个会话; 3. 调用session.BeginTransaction()开始一个事务; 4. 代码后面,我使用相同的连接创建了一个新会话: ISession session2 = ISessionFactory.OpenSession(dbConn)
当我尝试对session2运行任何查询时,我收到以下错误消息: ExecuteReader要求命令在待定本地事务中的连接具有事务。命令的Transaction属性未初始化。
尽管NHibernate重用了相同的连接,但它似乎没有将第二个ISession(或更具体地说,为该会话创建的Command对象)注册到开放事务中。
有没有办法在同一事务中拥有多个会话?
我不能使用单个会话,因为我有一个长时间运行的任务,加载并创建超过100万个对象。如果我使用一个ISession,则性能从每秒3000个数据库请求降至20个,因为NHibernate刷新的性能下降。为了解决这个问题,我想创建短暂的会话并快速处理它们。
然而,整个过程都包装在一个事务中。如果我使用自己的连接创建独立的后续会话,则会与第一个事务持有的表锁冲突并被冻结。为了解决这个问题,我需要在同一个事务中运行这些会话。
1个回答

7

你可以做的事情

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

  • ISession在3.3.1版本中似乎没有CreateSession方法。该方法是否在其他地方,或者是在更新的NHibernate版本中? * 我已经发现了ISession.Clear(),它非常好用。这是一个很好的建议。
- Alex
1
抱歉,应该是 ISession.GetSession(EntityMode.Poco)。已修复。 - Firo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接