NHibernate 效率

Posted

技术标签:

【中文标题】NHibernate 效率【英文标题】:NHibernate efficiency 【发布时间】:2008-12-19 16:43:26 【问题描述】:

在 ORM 和现代数据访问领域落后,我希望摆脱 DataSets (shdder) 并进入适当的映射框架。

我刚刚开始了解 Linq to SQL,我现在正在研究 NHibernate,以便在我们的下一个项目中使用它。

使用老式 sql 和数据集,您的 sql 查询显然只返回您想要的数据。我也知道 L2S 也很聪明,可以评估其 where 子句,以便它只返回您请求的对象。 NHibernate 是一样的吗? Ayende 的 Linq to NHibernate 也一样吗?

我的意思是,如果我做相当于:

Select * from customers where name = "fred"

它会将每个客户都提取到内存中,然后过滤掉非 freds,还是它足够聪明,只得到它需要的东西?

如果它是智能的,有什么注意事项?是否存在无法以这种方式评估的某些类型的查询?我需要注意哪些性能问题?

谢谢

安德鲁

【问题讨论】:

【参考方案1】:

一个快速的答案是 ORM 将检查属性名称并将其转换为 SQL 查询,该查询将为您命名 = ...。因此它不会将所有客户加载到内存中以搜索名称.

【讨论】:

【参考方案2】:

Nhibernate 提供了几种不同的方式来查询数据库。 Hibernate 使用称为 HQL 的类似 Sql 的语法,它是对象上的 SQL。它还可以通过示例进行搜索,在其中创建对象并填写所需的条件,然后 hibernate 会将具有相同属性值的对象从数据库中拉出。

看看这里它会让你加快速度summer of Nhibernate第2课和2a会更深入地回答

HTH

骨头

【讨论】:

【参考方案3】:

如果您真的担心 NHibernate 正在生成什么查询,请运行 SQL Server Profiler 并找出正在运行的内容或配置它的日志记录并打开其 SQL 输出。它将显示所有 SQL 语句到您配置其 log4net 的位置。

【讨论】:

我并不担心我只是想确定事实。你见过 Ayende 的休眠分析器吗? 我只看到了他在博客上发布的内容。看起来真的很整洁。是的,抱歉措辞,好奇会是一个更好的词。我个人知道我已经设置了 log4net 来捕捉一些讨厌的 N+1 场景。【参考方案4】:

无论您使用 HQL 还是 ICriteria,NHibernate 都会创建与您的示例类似的查询,但它实际上会更好。它将创建一个参数化的 sql 语句,以便查询可以缓存在 SQL Server 中。

ICriteria 非常灵活,但是要精通它需要一点学习曲线。我也建议在夏天使用 nhibernate 截屏视频,以便快速上手。

【讨论】:

【参考方案5】:

使用 NHibernate 实现“企业级”性能有点简单。

基于对象中的属性和关系映射,ORM 将为该获取构建特定查询。如果一个属性被标记为延迟加载,那么它将被排除在外,并且当在会话中访问该属性时,后续的提取将只获得那部分丢失的数据。因此,如果我们打开 SQL 分析器,翻译后的查询会像这样

Select cust.Address, cust.Email from customers cust where cust.Name = "fred"

查询的深度也很重要。我们可以通过使用 HQL 查询来限制返回的记录数(对于大型数据集很重要),这些查询根据您的数据库提供程序对数据进行分页......只要它们与 HQL 解析器一起使用。您还可以在关系映射上设置FetchModeCollectionFetchMode,这将在一次交互中执行连接以从多个表中进行选择。

如果您使用的是 SQL 服务器,则可以打开 sp_execsql,它将通过存储过程运行所有提取,以快速提升性能。

有关更多信息,请参阅Code Project 上的一篇精彩文章,其中详细介绍了如何在您的应用程序中提高 NHibernate 的性能。如果您使用的是面向服务的架构,延迟可能是一个大问题。查看this thread 了解更多详情。

【讨论】:

【参考方案6】:

是的,NHibernate 应该是目前性能最高的 ORM 之一,我曾在一个项目中使用过它,它非常酷。 关于 LINQ to NHibernate you may want to check this article。 有一个学习曲线(NHQL 和 ICriteria),如果你想跳起来一开始会很困难,但是所有投入的时间都会回到你身上。 希望这会有所帮助。

【讨论】:

【参考方案7】:

Linq to SQL 开发已放弃用于 Linq to Entities。你也应该试一试。

【讨论】:

以上是关于NHibernate 效率的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate学习教程-- 第一个NHibernate程序

NHibernate教程(19) —— 一级缓存

Nhibernate学习教程-- 开篇有益

NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

ASP.NET MVC、NHibernate 会话和 NHibernate 事件