【问题标题】:Multiple NHibernate sessions in one Transanction一个事务中的多个 Hibernate 会话
【发布时间】:2013-05-03 01:57:33
【问题描述】:

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

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

【问题讨论】:

    标签: .net sql nhibernate


    【解决方案1】:

    你可以做的事情

    • session.GetSession() 创建具有相同上下文(连接、事务、模式)的子会话
    • 如果您不需要级联,请使用 StatelessSession,这就是为此而设计的
    • 在每 50 个左右的对象之后使用 session.Clear();

    【讨论】:

    • * ISession 似乎没有 CreateSession,至少从 3.3.1 开始。该方法是在其他地方,还是在较新的 NHibernate 版本中? * 我已经发现了 ISession.Clear() 并且效果很好。这是一个很好的建议。
    • 抱歉,应该是ISession.GetSession(EntityMode.Poco)。修好了
    猜你喜欢
    • 2014-09-06
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多