我们(慢慢地)将应用程序(使用经典的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连接共享?我们该怎么办?
答案 0 :(得分:1)
是事务(持续一段时间)可以锁定数据库上的资源。因此减慢了其他操作。
您的交易应尽可能小。
如果不可能,请更改隔离模式。 http://en.wikipedia.org/wiki/Isolation_(database_systems)