2010-09-08 57 views
2

我们正在(缓慢地)将一个应用程序(使用经典的ADO.NET DAL)移动到NHibernate(遵循“每会话请求模式”和“存储库模式”)。做NHibernate的事务减慢其他ADO.NET连接?

的应用,现在,是在混合状态(我知道,这是horrorful):

  • 一些查询被一次性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连接共享?我们应该做什么?

回答

1

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

您的交易应尽可能最小。

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

+0

是否认为将NHibernate打开的事务附加到DAO的连接可以解决问题?或者同一个事务中的查询也放慢了? – Notoriousxl 2010-09-08 18:43:29

+0

没有交易应该处理特定的一套操作并保持一致性。如果这不会引起均衡问题,请尝试将小批量的大型交易分拆。 – 2010-09-08 19:52:58

+0

据我所见,从性能分析器(我没有编写应用程序,也没有在“NHibernate开关”中进行分析),交易量非常小,只能在存储库的方法中使用,而这些方法非常少。 ..所以这个错误很难找到:(我正在使用NHProf和SQL服务器分析器 - 我是一个“DB-noob” - ......也许我使用了错误的调试工具来检查未关闭的事务) – Notoriousxl 2010-09-08 20:15:38