NHibernate的映射速度非常慢 - 我该如何改进它?

时间:2011-09-01 03:22:39

标签: performance nhibernate mapping

我有一个简单的查询,我使用NHibernate和plain(my)SQL:

运行
SELECT Col1, Col2, Col3, Col4 FROM Data LIMIT 100000;

查询时间约为250毫秒。

当NHibernate将结果映射到实体列表时,大约需要4.5秒。 当我使用数据集/数据行和行[“Col1”]语法进行映射时,大约需要1.5秒。

我可以在两种方法之间看到的唯一区别是映射逻辑。 我禁用了nhibernate诊断和缓存,我正在使用无状态会话。

我的查询如下:

        using (var session = OpenStatelessSession())
        {
            return session.QueryOver<Data>()
                .Take(100000)
                .List();
        }

我的映射看起来像这样:

        Id(x => x.Col1);
        Map(x => x.Col2);
        Map(x => x.Col3);
        Map(x => x.Col4);

如何提高nhibernate的映射性能?也许有些东西我不见了?

1 个答案:

答案 0 :(得分:0)

如果你真的有一个需要读取4列数据的应用程序,一次100,000行,性能至关重要,那就不要使用NHibernate。但是,如果这与您的应用程序的典型数据库使用情况不一样,那么它并没有真正告诉您太多。 (这有点像比较摩托车,皮卡车和卡车的四分之一英里速度。)

虽然使用ORM会产生开销,但在实际使用中,您获得的收益远远超过您的损失。缓存(第一级和第二级),延迟加载,查询批处理等都可以提供性能改进,这是您在接近金属时所不能获得的。

已经做了很多努力来将NHibernate与其他ORM和数据访问策略(例如this comparison of NHibernate and EF)进行对比。它们通常是有争议的,根据我使用NHibernate五年的经验,它们几乎没有相关性。

即使您确实找到了需要调整性能的领域,与ORM可以为应用程序开发带来的无数好处和成本节省相比,它通常是一个相对容易且廉价的问题。