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] <%X{auth}> - %m%n"></param>
</layout>
</appender>
在日志文件中,我看到一个查询在短时间内运行多次,我想找到运行它的代码。我能够通过表名找到hbm文件,以及它映射到的类。
我查找了关于那个类的参考资料——但是有很多。
所以我的基本问题是我如何找到哪个代码运行特定的查询?这可能吗?
谢谢
你试过Nhibernate Profiler吗?使用分析器会有所帮助,如果我记得正确,我认为你得到每个查询的堆栈跟踪?
关于分析器的更多信息http://www.hibernatingrhinos.com/products/nhprof
您可以在
您的应用程序也使用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 。