使用Fluent NHibernate检索大型数据集

本文关键字:大型 数据集 检索 NHibernate Fluent 使用 | 更新日期: 2023-09-27 18:07:20

我正在构建一个解决方案,其中我从数据库检索大量数据(5k到10k记录)。我们现有的数据访问层使用的是Fluent NHibernate,但是我"害怕"我将会产生大量的开销,因为这些开销是用来表示数据库实体的对象模型。

我可以检索简单的ADO数据集吗?

使用Fluent NHibernate检索大型数据集

是的,您应该关注它的性能。你可以看看使用NHibernate的IStatelessSession功能。然而,这可能不会给你你正在寻找的性能。虽然自2.1.2GA以来我就没有使用过NH,但我发现,在批量操作方面,它们不太可能大幅提高NH的性能。坦率地说,当涉及到批量操作时,NH(以及大多数orm)都很糟糕。

Q:我可以简单地检索ADO数据集吗?

你当然可以。仅仅因为你使用NHibernate并不意味着你不能创建ADO。. NET连接并以原始方式访问数据库。

尽管我非常讨厌数据表和数据集,但这是您可能想要考虑使用它们而不是添加映射/创建与您的10K行数据相关的对象的开销的极少数情况之一。

根据您需要的性能,有几个选项。没有什么比使用sqldatareader更好的了,因为它是几乎每个。net ORM实现的底层。除了是最快的,如果你不需要在查询后保存所有记录的列表,它可以占用更少的内存。

至于你担心的成绩,5k-10k的记录并不是那么高。我以前从nhibernate中提取过100多万行数据,但很明显,这些记录并不大,而且只是一个案例。如果你是在一个高流量的网站上这样做,那么当你遇到瓶颈时,你当然必须更有效率。如果你正在考虑数据集,我建议你尝试Massive,因为它应该仍然比DataSet/Table更有效,更方便。

您可以使用"标量查询",它实际上是返回对象[]列表的本地SQL查询(每行一个对象[]):

sess.CreateSQLQuery("SELECT * FROM CATS")
 .AddScalar("ID", NHibernateUtil.Int64)
 .AddScalar("NAME", NHibernateUtil.String)
 .AddScalar("BIRTHDATE", NHibernateUtil.Date)

NHibernate文档中的示例:http://nhibernate.info/doc/nh/en/index.html#d0e10794