5

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

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

4

1 回答 1

7

你可以做的事情

  • session.GetSession()创建具有相同上下文(连接、事务、模式)的子会话
  • 如果你不需要级联使用 StatelessSession 这意味着
  • session.Clear();每 50 个左右对象后使用
于 2013-05-03T09:03:06.933 回答