【问题标题】:NHibernate - find the code that's executing the queryNHibernate - 找到执行查询的代码
【发布时间】:2014-08-21 06:38:26
【问题描述】:

我正在从事一个由其他人完成的非常大的项目。这段代码中有很多项目,它使用 NHibernate 作为 ORM。数据库非常繁忙,所以我正在尝试诊断它慢的地方并尝试诊断整个系统流程。

我做过的一件事是为 NHibernate.SQL 添加一个 log4net,它将所有正在运行的查询输出到一个日志文件:

<logger name="NHibernate.SQL" additivity="false">
    <level value="ALL" />
    <appender-ref ref="NHibernateSQLAppender" />
</logger>

这是附加程序:

<appender name="NHibernateSQLAppender" type="log4net.Appender.RollingFileAppender">
        <file value="NHibernateSQL.txt"></file>
        <appendToFile value="true"></appendToFile>
        <maximumFileSize value="15MB"></maximumFileSize>
        <maxSizeRollBackups value="10"></maxSizeRollBackups>
        <rollingStyle value="Size"></rollingStyle>
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] [%line] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"></param>
        </layout>
</appender>

在日志文件中,我看到一个在短时间内运行多次的查询,我想找到运行它的代码。我能够通过表名和映射到的类找到 hbm 文件。

我搜索了对该类的引用 - 但有很多。

所以我的基本问题是如何找到运行该特定查询的代码?这有可能吗?

谢谢

【问题讨论】:

标签: c# nhibernate


【解决方案1】:

您尝试过 Nhibernate Profiler 吗?使用分析器会有所帮助,如果我没记错的话,我想你会得到每个查询的堆栈跟踪?

有关分析器的更多信息http://www.hibernatingrhinos.com/products/nhprof

【讨论】:

    【解决方案2】:

    您可以将 中的名称(空格)设置为仅 NHibernate(不带 .SQL),这将非常冗长。然后您可以从 ALL 回到 TRACE 或 DEBUG 级别,或者寻找具有有用信息的特定命名空间。

    您的应用程序也使用 log4net 吗?然后您可以获得应用程序和 NHibernate 的组合日志,检查发送查询的内容。只需在应用程序的命名空间中添加另一个 块;你可以使用相同的

    通常,您可以在 SQL 查询中轻松查看数据库对象。

    很多次(通常是 100 次)同一个查询指出了臭名昭著的 N+1 问题 - 通过迭代父对象/行并初始化子集合来加载许多父对象/行的从属行/对象。例如,发送

    SELECT * FROM Children WHERE ParentId=@parid /* for some 100 Parent objects. */
    

    这是之前返回 N 个父对象的第一个 (1) 个查询,加上每个父对象上的 N 个子集合查询。

    N+1 甚至变得更糟,当程序员不熟悉 NHibernate 集合并实现错误,或者开始编写自己的集合处理而没有 NHibernate 集合映射(将 NHibernate 字面理解为 OR 映射器,从 SQL 结果生成对象或否则)。用连接替换可能会导致结果集过大(笛卡尔积)。

    但是 NHibernate 也是数据库访问的优化器,在会话工厂配置中提供了 N+1 和怪物连接之间的好方法,即批量设置(adonet.batch_size 50,例如),然后在每个类元素和集合属性上设置 batch-size

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2020-12-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多