9

我已经简要介绍了 NHibernate 和 Linq2Sql。我也打算看看实体框架。

当我谈到这些 ORM 时,提出的问题是“它们无法扩展”,那么它们可以吗?从谷歌我得到的印象是他们能够很好地扩展,但最终我认为必须付出代价,是否值得为更丰富、更简单的业务层付出代价。

4

3 回答 3

5

这是一个很好的问题,恕我直言,它们可以像任何自定义 DAL 一样进行扩展。我只使用过 nHibernate,所以我将只关注它以及它具有的有助于扩展系统的功能。

  • 延迟加载 - 由于它支持延迟加载,您可以避免加载任何不必要的项目。当然,您需要注意 Select n+1 问题,但是系统中有一些东西可以防止这种情况发生。
  • Eager Fetching - 有多种方法可以急切地获取您可能需要的对象,从而避免额外的 SQL 访问。
  • 二级缓存 - nHibernate 支持二级缓存,可用于通过减少对数据库的访问来提高可伸缩性。有各种可用的支持提供商可以为您提供一些灵活性。
  • 编写您自己的 SQL - 在 nHibernate 中,您可以调用存储过程,或提供将返回您的实体的内联 SQL 查询。这将让您在生成的 sql 没有剪切它时使用自己的 SQL。例如,使用递归查询急切加载自连接树。

话虽如此,我认为最初调整自定义 DAL 层更容易,因为您熟悉它的结构并且可以对其进行微调;然而,一个好的 ORM 将提供大量的钩子,让您可以进行相当多的优化。你只需要花一些时间来学习它。

我还认为,如果您有一个性能关键的代码区域并且您不能让您的 ORM 在您的要求范围内工作,那么对于您应用程序的那个小区域,您可以自定义构建您自己的 DAL 层。如果您正在使用一个像样的设计模式,例如由工厂创建的存储库,那么您需要做的就是更换存储库的实现

于 2009-02-13T13:59:02.993 回答
2

Hibernate Shards正在移植到 NHibernate,这将允许水平扩展。

还有一些非常酷的 hack,比如这个来实现分片。

所以答案是肯定的,NHibernate 可以扩展,以一种持久性无知和完全透明的方式。

于 2009-02-13T15:43:07.160 回答
1

说在 ORM 中构建的应用程序不能很好地扩展是完全不正确的。当然,在粗心或懒惰的开发人员通过编写生成极低效率的 SQL 的代码滥用 ORM 之前,这种情况就已经发生了。构建高性能应用程序意味着了解所有可爱的抽象实际上在幕后所做的事情。然而,远离这个陷阱并不需要太多。使用 ORM 并不意味着永远不会打开 SQL 分析器或NHibernate Profiler

关于 SP 的速度要快得多的说法,请阅读thisthis。此外,如果您需要,ORM(至少是 NHibernate)为您提供了使用 SP 的非常简单的方法。

于 2009-02-16T01:36:36.800 回答