我有一个广泛使用 NHibernate 的应用程序。我已经开始使用 NHibernate Profiler 来识别可能的性能问题。我的问题与查询持续时间统计有关。
该统计数据在数据库持续时间和总持续时间中细分。根据我的阅读,数字应该非常接近。但是,我看到了相对较大的差异,我正试图找出这些差异的来源。这是一些数据
关于我可以从哪里开始解决这些问题的任何想法?
我有一个广泛使用 NHibernate 的应用程序。我已经开始使用 NHibernate Profiler 来识别可能的性能问题。我的问题与查询持续时间统计有关。
该统计数据在数据库持续时间和总持续时间中细分。根据我的阅读,数字应该非常接近。但是,我看到了相对较大的差异,我正试图找出这些差异的来源。这是一些数据
关于我可以从哪里开始解决这些问题的任何想法?
您的应用程序使用 log4net 吗?如果是这样,您应该检查您的 log4net 配置并减少您从 NHibernate 记录的数据量。
我现在正在处理的项目中的一个示例:对于返回 60 行/对象的查询,将 DEBUG 级别的所有 NHibernate 日志消息记录到文件中,将 NHibernate 报告的总持续时间从 8 毫秒增加到大约 8000 毫秒!
限制 NHibernate 输出的示例配置:
<root>
<level value="ALL" />
<appender-ref ref="console" />
<appender-ref ref="trace" />
</root>
<logger name="NHibernate">
<level value="WARN" />
</logger>
如果这不能解决您的问题,也许您可以使用 dotTrace 或 ANTS Profiler 之类的性能分析工具来识别代码中的潜在瓶颈。这将让您清楚地了解您/NHibernate 代码中的哪些方法需要花费大量时间。
我不知道事实,但我总是假设总持续时间增加了构建 SQL 查询的所有 NHibernate 开销,并在数据检索时用原始数据构建实体。
也许您的实体的构建过程非常缓慢?您的实体构造函数中是否有一些广泛的处理?任何 IO 操作、日志记录、额外的数据库访问、网络使用...
祝你好运
嗨,我不认为你正在寻找正确的地方。您不应该查看数据库持续时间等。一旦执行到 dB lvl,您就无法做太多事情。
相反,您应该关注的是您向数据库发送了多少查询。您能否通过避免冗余调用或缓存某些查询来以某种方式最小化它们。您是仅检索与您有关的属性,还是将整个对象加载到内存中然后对其进行处理。
另外,您正在使用什么平台,我可能会建议您使用更好的工具来识别应用程序中的瓶颈。
希望有帮助。
第一个结果是执行和从数据库检索结果所花费的时间。第二个结果是 NHibernate 将相应实体加载到内存中所花费的时间。
我现在在一个项目中工作,该项目利用了一个非常大的实体(几乎 100 列/字段)。如果我尝试加载几千个,也需要几秒钟。但是,sql-query 将在几毫秒内返回实体 ID 列表。但是要将这些 id 实际加载到相应的实体中,如果您的实体是大型或复杂对象(请参阅上面的帖子),则会产生额外的开销。
您是否收到生成的查询的任何警报?NHibernate Profiler 中 Duration 旁边的列。
最好的问候,
马蒂亚斯