NHibernate -找到执行查询的代码

本文关键字:查询 代码 执行 NHibernate | 更新日期: 2023-09-27 18:18:31

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

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

<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文件,以及它映射到的类。

我查找了关于那个类的参考资料——但是有很多。

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

谢谢

NHibernate -找到执行查询的代码

你试过Nhibernate Profiler吗?使用分析器会有所帮助,如果我记得正确,我认为你得到每个查询的堆栈跟踪?

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

您可以在只到NHibernate(没有. sql),这将是相当冗长的。然后,您可以从ALL返回到TRACE或DEBUG级别,或者查找具有有用信息的特定名称空间。

您的应用程序也使用log4net吗?然后你可以得到应用程序和NHibernate的组合日志,检查是什么发送了查询。只需添加另一个块与应用程序的命名空间;您可以使用相同的<追加符>!

通常,您可以很容易地在SQL查询中看到数据库对象。

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

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

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

N+1甚至变得更糟,当程序员不熟悉NHibernate集合和实现错误,或者开始编写自己的集合处理没有NHibernate集合映射(理解NHibernate字面上是一个or映射器,从SQL结果或其他)。用连接替换可能会导致过大的结果集(笛卡尔积)。

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