NHibernate映射非常慢

NHibernate映射非常慢,nhibernate,Nhibernate,我正在使用nhibernate从遗留oracle数据库创建一个不可变域对象的集合。一些使用CriteriaAPI的简单查找需要60秒以上。如果同一查找的后续查找速度非常快,通常小于300ms 100ms(以db为单位),其余由nhibernate进行,我没有启用2级缓存或查询缓存,所有查询都会转到我使用nhibernate prof检查的db。但是,如果我让应用程序空闲几分钟,然后再次运行查找,通常需要50-60秒 我使用过nhibernate profiler,在每种情况下,它都清楚地显示在数

我正在使用nhibernate从遗留oracle数据库创建一个不可变域对象的集合。一些使用CriteriaAPI的简单查找需要60秒以上。如果同一查找的后续查找速度非常快,通常小于300ms 100ms(以db为单位),其余由nhibernate进行,我没有启用2级缓存或查询缓存,所有查询都会转到我使用nhibernate prof检查的db。但是,如果我让应用程序空闲几分钟,然后再次运行查找,通常需要50-60秒

我使用过nhibernate profiler,在每种情况下,它都清楚地显示在数据库中的时间最多为100ms,我认为剩下的时间必须由nhibernate占用,我不明白为什么

一些背景信息:

我使用动态组件将20列映射为键值 对。 使用NHibernate2.1 我正在映射中使用动态组件

一旦检索到数据,就永远不会修改,在映射中,我是 使用mutable=false标志

这是一个遗留数据库,所以我使用的是复合数据库 输入映射。 在每次查找中,我只检索大约50个对象

当我打开会话时,我已设置FlushMode=Never

我还尝试了无状态会话,但在初始查找时性能仍然很慢 我不在映射中定义或使用任何自定义用户类型
我显然做错了什么或错过了什么,有什么想法吗

这很可能不是Nhibernate的问题

使用下面的代码计算返回数据所需的时间。db+网络延迟+nhibernate\u执行 确定不存在与应用程序相关的延迟后,通过查看查询计划缓存和查询结果缓存来检查数据库。第一次运行查询时,如果缓存未命中,您的数据库将投入耗时且密集的操作来生成结果集。 如果1和2没有提供任何有用的信息,请检查您的网络。可能是网络压力造成了严重的延迟。 正如JeffreyABecker在下面提到的,研究会话工厂是如何处理/创建的。查找ISessionFactory.Dispose或configuration.BuildSessionFactory的用法。构建ISessionFactory对象是一项昂贵的操作,通常,您应该在应用程序启动时创建它们,并在应用程序停止/关闭时处置它们。60s>对于ISessionFactory实例化来说,这仍然是一个合理的数字。
这很可能不是Nhibernate的问题

使用下面的代码计算返回数据所需的时间。db+网络延迟+nhibernate\u执行 确定不存在与应用程序相关的延迟后,通过查看查询计划缓存和查询结果缓存来检查数据库。第一次运行查询时,如果缓存未命中,您的数据库将投入耗时且密集的操作来生成结果集。 如果1和2没有提供任何有用的信息,请检查您的网络。可能是网络压力造成了严重的延迟。 正如JeffreyABecker在下面提到的,研究会话工厂是如何处理/创建的。查找ISessionFactory.Dispose或configuration.BuildSessionFactory的用法。构建ISessionFactory对象是一项昂贵的操作,通常,您应该在应用程序启动时创建它们,并在应用程序停止/关闭时处置它们。60s>对于ISessionFactory实例化来说,这仍然是一个合理的数字。
我建议下载一个C性能分析器,比如dotTrace。您将能够快速更准确地了解性能问题所在。我很确定这不是一个NHibernate映射问题。

我建议下载一个C性能分析器,比如dotTrace。您将能够快速更准确地了解性能问题所在。我很确定这不是NHibernate映射问题。

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

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

听起来像是远程数据库?第一个连接需要很长时间才能打开,而后续连接使用池?是否只需一个查询即可加载集合?是的,只需一个查询即可加载集合。我使用了nhibernate教授,它只显示一个到数据库的查询,而且nhibernate教授显示数据库所花费的时间最多为300毫秒,听起来像是一个远程数据库?第一个连接需要很长时间才能打开,而后续连接使用池?是否只需一个查询即可加载集合?是的,只需一个查询即可加载集合。我使用了nhibernate prof,它只显示了一个到数据库的查询,而且nhibernate prof显示数据库所花费的时间最多为300毫秒,正如您所建议的1和2,没有任何与应用程序相关的代码,第一次调用就花了50秒,nhibernate prof始终显示数据库不是瓶颈。我会用a.n
et profiler Nexts此处报告的类似问题我已经按照您的建议完成了1和2,在没有任何应用程序相关代码的情况下,第一次呼叫花费了50秒,nhibernate教授始终显示db不是瓶颈。下一个问题我将使用.net探查器我使用的是dotTrace,它似乎是oracle.DataAccess.Client OracleDataReader.Read方法在某些调用上需要50秒,即使实际的db查询只有300毫秒。您使用过SQL探查器而不是NHibernate探查器吗,为了确保查询只需要300毫秒?我使用了dotTrace,它似乎是oracle.DataAccess.Client OracleDataReader.Read方法在某些调用上需要50秒,即使实际的db查询只需要300毫秒。您是否使用了SQL探查器而不仅仅是NHibernate探查器来确保查询只需要300毫秒? //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);