NHibernate映射非常慢

时间:2012-01-28 11:26:06

标签: nhibernate

我正在使用nhibernate,从传统的oracle DB创建一组不可变的域对象。使用Criteria api进行一些简单的查找需要60秒以上。如果相同查找的后续查找速度非常快,通常小于300毫秒(db中为100毫秒,nhibernate为静态, 我没有启用2级缓存或查询缓存 ,所有查询确实是我使用nhibernate教授检查的数据库。但是,如果我将应用程序闲置几分钟并再次运行查询,则需要50-60秒,

我已经使用了nhibernate profiler,并且在每种情况下它都清楚地显示只有最多100ms是花在数据库中,我认为剩下的时间必须由nhibernate,我不明白为什么?

一些背景信息:

  1. 我使用动态组件将20列映射到键值 对。
  2. 使用nhibernate 2.1
  3. 我在映射中使用了动态组件

  4. 一旦检索到数据,我就永远不会修改数据 使用mutable = false flag。

  5. 它是一个遗留数据库所以我使用的是复合数据 关键的映射。
  6. 我只在每次查询中重新检索约50个对象

  7. 当我打开会话时,我设置了FlushMode = Never

  8. 我也尝试过无状态会话(初始查找时性能仍然很慢)
  9. 我没有在映射中定义或使用任何自定义用户类型
  10. 我显然做错了什么或错过了一些事情,任何想法?

3 个答案:

答案 0 :(得分:2)

我建议下载一个C#性能分析器,例如dotTrace。您将能够快速准确地了解性能问题的位置。我很确定它不是NHibernate映射问题。

答案 1 :(得分:1)

很可能不是Nhibernate问题。

  1. 使用以下代码计算恢复数据所需的时间。 (db + network_latency + nhibernate_execution)
  2. 一旦肯定没有涉及APP相关延迟,请查看查询计划缓存和查询结果缓存来检查数据库。第一次运行查询时,缓存未命中,您的数据库将投入耗时且密集的操作来生成结果集。
  3. 如果1和2未提供任何有用信息,请检查您的网络。也许一些网络压力导致严重的延迟。
  4. 如下面的JeffreyABecker所述,研究会话工厂如何处置/创建。查找ISessionFactory.Dispose()configuration.BuildSessionFactory()的用法。构建ISessionFactory对象是一项昂贵的操作,通常,您应该在应用程序启动时创建它们,并在应用程序停止/关闭时将它们处理掉。 60>它仍然是ISessionFactory实例化的声音编号。
  5.     //Codez
    Stopwatch stopwatch = new Stopwatch(); // Begin timing stopwatch.Start(); // Nhibernate specific stuff ONLY in here // Depending on your setup, do a session.Flush(); if possible. // End Timing stopwatch.Stop(); // Write result - console/log4net/diagnostics.debug/etc Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed);

答案 2 :(得分:1)

如何管理SessionFactory的生命周期?您的SessionFactory可能会在一段时间不活动后被处理掉?