NHibernate的事务是否会降低其他ADO.NET连接的速度?

时间:2010-09-08 17:58:18

标签: .net nhibernate ado.net transactions locking

我们(慢慢地)将应用程序(使用经典的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连接共享?我们该怎么办?

1 个答案:

答案 0 :(得分:1)

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

您的交易应尽可能小。

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