【问题标题】:Do NHibernate's transactions slow down other ADO.NET connections?NHibernate 的事务会减慢其他 ADO.NET 连接吗?
【发布时间】:2010-09-08 17:58:18
【问题描述】:

我们正在(缓慢地)将应用程序(使用经典 ADO.NET DAL)迁移到 NHibernate(遵循“每个请求一个会话模式”和“存储库模式”)。

应用程序现在处于混合状态(我知道,这很可怕):

  • 一些查询是由一次性 DAO 对象进行的(在其构造函数中打开一个连接并在其 Dispose() 方法中处理它);

  • 一些查询是由强类型存储库(其 Get()、Save()、Update() 和 Delete() 方法总是启动新事务 - 遵循此建议 http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions - 或加入现有交易)。

... DAO 对象进行的查询非常慢(比以前慢两倍)。

我们之前遇到过数据库锁定问题(请参阅Isn't NHibernate's "one session per request" pattern a bit dangerous for long web requests?),我们解决了它仅在需要时打开多个事务,并尽快关闭它们(不仅在当前 Web 请求结束时)。因此,现在,我们的 NHIbernate 实现遵循“每个请求一个会话”模式,但具有“每个请求多个事务”。

但速度问题仍然存在。实现与以前相同速度的唯一方法是完全禁用 NHibernate 事务。

您认为可能是什么原因? NHibernate 事务不与旧的 ADO.NET 连接共享?我们该怎么办?

【问题讨论】:

    标签: .net nhibernate ado.net transactions locking


    【解决方案1】:

    是的事务(持续一段时间)可以锁定数据库上的资源。因此会减慢其他操作。

    您的交易应该尽可能小。

    如果不可能,请更改您的隔离模式。 http://en.wikipedia.org/wiki/Isolation_(database_systems)

    【讨论】:

    • 你认为将NHibernate打开的事务附加到DAO的连接可以解决问题吗?还是同一事务中的查询也变慢了?
    • 任何事务都不应该处理特定的一组操作并保持一致性。如果这不会引入一致性问题,请尝试将您的大型事务拆分为较小的批次。
    • 据我从分析器中看到的(我没有编写应用程序,也没有参与“NHibernate 切换”),事务还非常小,仅在 Repositories 内部使用方法,这些方法非常少......所以很难找到这个错误:((我正在使用 NHProf 和 SQL 服务器分析器 - 我是一个“DB-noob” - ......也许我使用了错误的调试检查未关闭交易的工具)
    • 你说得对,我对你的申请一无所知,我只能对你的问题回答是。我建议您在 serverfault.com 上咨询数据库专家
    • 别担心...也因为您是对的 :) 今天我们发现数据库运行缓慢只是因为网络上运行的是旧版本的“错误”网络应用程序服务器;更新并重新启动它解决了一切,所以问题实际上是“长事务”
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多