Performance 使用Direct ado.net与ORM的性能提升?

Performance 使用Direct ado.net与ORM的性能提升?,performance,nhibernate,ado.net,Performance,Nhibernate,Ado.net,如果我将应用程序的数据访问部分从nhiberate替换为straight ado.net,我会获得性能提升吗 我知道NHibernate的核心是使用ado.net 简短回答: 这取决于您执行的操作类型。如果编写好SQL,您可能会获得性能改进,但在某些情况下,由于丢失了NHibernate缓存等,您可能会获得更差的性能 长答案: 正如您所提到的,NHibernate位于ADO.NET之上,提供了一个抽象层。这在许多方面使您的生活更轻松,但由于所有抽象层都有一定的性能成本 您可能会看到性能优势的主要

如果我将应用程序的数据访问部分从nhiberate替换为straight ado.net,我会获得性能提升吗


我知道NHibernate的核心是使用ado.net

简短回答:

这取决于您执行的操作类型。如果编写好SQL,您可能会获得性能改进,但在某些情况下,由于丢失了NHibernate缓存等,您可能会获得更差的性能

长答案:

正如您所提到的,NHibernate位于ADO.NET之上,提供了一个抽象层。这在许多方面使您的生活更轻松,但由于所有抽象层都有一定的性能成本

您可能会看到性能优势的主要情况是同时操作多个对象,例如更新多个实体或获取大量实体。这是因为NHibernate会话在跟踪哪些对象被修改等方面所做的工作。我的经验是,随着会话中实体数量的增加,NHibernate的性能会显著下降

NHibernate有很多提高性能的方法,如果您真的很了解它,您可以让它的性能非常接近ADO.NET。然而,如果你对它不太熟悉,你可以很容易地击中自己的脚,从性能上看。(选择N+1问题等)

在某些情况下,当从NHibernate切换到straight ADO.NET时,性能可能会变差。这是因为NHibernate抽象层引入了一些可以提高性能的特性,比如缓存。NHibernate还包括优化当前数据库管理系统生成的SQL的功能。例如,如果您使用的是SQL Server,则生成的SQL可能与使用Oracle时略有不同


值得一提的是,这不一定是一种全有或全无的情况。您可以使用NHibernate进行90%的数据库访问,这一点非常好,然后使用直接SQL进行10%的复杂查询、批量插入/更新等操作。

简短回答:

这取决于您执行的操作类型。如果编写好SQL,您可能会获得性能改进,但在某些情况下,由于丢失了NHibernate缓存等,您可能会获得更差的性能

长答案:

正如您所提到的,NHibernate位于ADO.NET之上,提供了一个抽象层。这在许多方面使您的生活更轻松,但由于所有抽象层都有一定的性能成本

您可能会看到性能优势的主要情况是同时操作多个对象,例如更新多个实体或获取大量实体。这是因为NHibernate会话在跟踪哪些对象被修改等方面所做的工作。我的经验是,随着会话中实体数量的增加,NHibernate的性能会显著下降

NHibernate有很多提高性能的方法,如果您真的很了解它,您可以让它的性能非常接近ADO.NET。然而,如果你对它不太熟悉,你可以很容易地击中自己的脚,从性能上看。(选择N+1问题等)

在某些情况下,当从NHibernate切换到straight ADO.NET时,性能可能会变差。这是因为NHibernate抽象层引入了一些可以提高性能的特性,比如缓存。NHibernate还包括优化当前数据库管理系统生成的SQL的功能。例如,如果您使用的是SQL Server,则生成的SQL可能与使用Oracle时略有不同


值得一提的是,这不一定是一种全有或全无的情况。您可以在90%的数据库访问中使用NHibernate,而在10%的数据库访问中,您可以使用直接SQL进行复杂查询、批量插入/更新等操作。

我想说的不多,当您的代码编译时,大多数代码会得到优化,并从NHibernate转换为其他形式,这显然比纯NHibernate更有效,并且可能非常接近direct ado.net提供的性能增益。只是一个想法。谢谢这几乎是不可能回答的,因为您可能正在ADO.NET之上进行一些工作,以将数据读取器转换为对象。很难知道NHibernate是否会比您的自定义代码更高效地完成这项工作。我想说的不多,当您的代码编译时,大多数代码会得到优化,并从NHibernate转换为其他形式,这显然比纯NHibernate更有效,并且可能非常接近direct ado.net提供的性能增益。只是一个想法。谢谢这几乎是不可能回答的,因为您可能正在ADO.NET之上进行一些工作,以将数据读取器转换为对象。很难知道NHibernate是否能比您的自定义代码更高效地完成这项工作。