11

我有一个广泛使用 NHibernate 的应用程序。我已经开始使用 NHibernate Profiler 来识别可能的性能问题。我的问题与查询持续时间统计有关。

该统计数据在数据库持续时间和总持续时间中细分。根据我的阅读,数字应该非常接近。但是,我看到了相对较大的差异,我正试图找出这些差异的来源。这是一些数据

替代文字

关于我可以从哪里开始解决这些问题的任何想法?

4

4 回答 4

6

您的应用程序使用 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 代码中的哪些方法需要花费大量时间。

于 2011-09-15T11:28:57.597 回答
0

我不知道事实,但我总是假设总持续时间增加了构建 SQL 查询的所有 NHibernate 开销,并在数据检索时用原始数据构建实体。

也许您的实体的构建过程非常缓慢?您的实体构造函数中是否有一些广泛的处理?任何 IO 操作、日志记录、额外的数据库访问、网络使用...

祝你好运

于 2011-01-07T19:28:16.997 回答
0

嗨,我不认为你正在寻找正确的地方。您不应该查看数据库持续时间等。一旦执行到 dB lvl,您就无法做太多事情。

相反,您应该关注的是您向数据库发送了多少查询。您能否通过避免冗余调用或缓存某些查询来以某种方式最小化它们。您是仅检索与您有关的属性,还是将整个对象加载到内存中然后对其进行处理。

另外,您正在使用什么平台,我可能会建议您使用更好的工具来识别应用程序中的瓶颈。

希望有帮助。

于 2011-01-07T18:06:55.893 回答
0

第一个结果是执行和从数据库检索结果所花费的时间。第二个结果是 NHibernate 将相应实体加载到内存中所花费的时间。

我现在在一个项目中工作,该项目利用了一个非常大的实体(几乎 100 列/字段)。如果我尝试加载几千个,也需要几秒钟。但是,sql-query 将在几毫秒内返回实体 ID 列表。但是要将这些 id 实际加载到相应的实体中,如果您的实体是大型或复杂对象(请参阅上面的帖子),则会产生额外的开销。

您是否收到生成的查询的任何警报?NHibernate Profiler 中 Duration 旁边的列。

最好的问候,
马蒂亚斯

于 2011-05-18T08:44:50.230 回答