我正在使用nhibernate,从传统的oracle DB创建一组不可变的域对象。使用Criteria api进行一些简单的查找需要60秒以上。如果相同查找的后续查找速度非常快,通常小于300毫秒(db中为100毫秒,nhibernate为静态, 我没有启用2级缓存或查询缓存 ,所有查询确实是我使用nhibernate教授检查的数据库。但是,如果我将应用程序闲置几分钟并再次运行查询,则需要50-60秒,
我已经使用了nhibernate profiler,并且在每种情况下它都清楚地显示只有最多100ms是花在数据库中,我认为剩下的时间必须由nhibernate,我不明白为什么?
一些背景信息:
我在映射中使用了动态组件
一旦检索到数据,我就永远不会修改数据 使用mutable = false flag。
我只在每次查询中重新检索约50个对象
当我打开会话时,我设置了FlushMode = Never
我显然做错了什么或错过了一些事情,任何想法?
答案 0 :(得分:2)
我建议下载一个C#性能分析器,例如dotTrace。您将能够快速准确地了解性能问题的位置。我很确定它不是NHibernate映射问题。
答案 1 :(得分:1)
很可能不是Nhibernate问题。
ISessionFactory.Dispose()
或configuration.BuildSessionFactory()
的用法。构建ISessionFactory对象是一项昂贵的操作,通常,您应该在应用程序启动时创建它们,并在应用程序停止/关闭时将它们处理掉。 60>它仍然是ISessionFactory实例化的声音编号。 //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可能会在一段时间不活动后被处理掉?