簡體   English   中英

NHibernate-查找正在執行查詢的代碼

[英]NHibernate - find the code that's executing the query

我正在做一個由別人完成的非常大的項目。 該代碼中包含許多項目,並且使用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文件。

我搜索了關於該類的參考-但是有很多。

所以我的基本問題是如何找到運行該特定查詢的代碼? 那有可能嗎?

謝謝

您是否嘗試過Nhibernate Profiler? 使用探查器將有所幫助,如果我記得正確的話,我認為您會獲得每個查詢的堆棧跟蹤信息?

有關探查器的更多信息http://www.hibernatingrhinos.com/products/nhprof

您可以在<logger>中將name(space)設置為僅NHibernate(不帶.SQL),這非常冗長。 然后,您可以從ALL返回TRACE或DEBUG級別,或者尋找包含有用信息的特定名稱空間。

您的應用程序也使用log4net嗎? 然后,您可以獲取應用程序和NHibernate的組合日志,並檢查發送查詢的內容。 只需在應用程序的名稱空間中添加另一個<logger />塊即可; 您可以使用相同的<appender>!

通常,您可以在SQL查詢中輕松查看數據庫對象。

很多時候(通常是100次),相同的查詢指出了臭名昭著的N + 1問題-通過遍歷父級並初始化子級集合,為許多父級對象/行加載從屬行/對象。 例如,發送

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

這是第一個(1)查詢,在此之前返回N個父對象,再加上對每個父對象的N個子集合的查詢。

當程序員不熟悉NHibernate集合並實現錯誤,或者開始編寫自己的集合處理而沒有NHibernate集合映射時,N + 1甚至會變得更糟(將NHibernate從字面上理解為OR映射器,或者從SQL結果生成對象,或者從其他角度來理解對象)。 用聯接替換可能會導致結果集(笛卡爾積)過大。

但是NHibernate還是數據庫訪問的優化器,它提供了N + 1和怪獸連接之間的好方法,即在會話工廠配置( 例如adonet.batch_size 50 )中設置批處理設置,然后在每個類元素上設置批處理大小和收藏財產。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM