簡體   English   中英

NHibernate和攔截器 - 測量/監控SQL往返時間

[英]NHibernate and interceptors - measuring/monitoring SQL round-trip times

為了獲得緩慢或潛在緩慢區域的早期警告,我想要一個可以作為性能監視器的NHibernate Interceptor,這樣任何超過給定時間的數據庫操作都會引發一個事件和(重要的是)應用程序日志中的完整堆棧跟蹤。

攔截器似乎是一個很好的窗口。 但是,經過實驗,似乎沒有任何方法可以捕獲“剛從SQL返回”事件:

  • OnPreFlushOnPostFlush適用於涉及寫入的完整批處理,但不會在讀取事件上調用。
  • OnPrepareStatement()似乎是最好的開始測量,但要停止?
  • 對於讀取事件, OnLoad可能是停止時鍾的地方,但它被稱為每個實體返回一次 - 我如何知道何時到達所有實體的末尾?
  • 對於寫事件,我看不到任何post-SQL事件(除了那些適用於整個批處理的事件 - OnPostFlushOnAfterTransaction ;我得到印象OnSaveOnFlushDirty等在實際數據庫調用發生之前被調用 - 很高興成為雖然糾正了)。

據我所知,文檔嚴重缺乏NHibernate與數據庫交互的管道順序,因此在該管道中,與實際的SQL執行本身相關地調用不同的事件和攔截器調用。

這是需要永久可用的東西,坐在后台,幾乎不需要人為干預,除非檢測到慢速查詢。 它還需要在大型服務器場上無頭運行,因此NHibernate Profiler等交互式工具已經出局了:它實際上是我們可以啟用和忘記的東西,讓它在適當的時候記錄。

有什么我錯過或誤解了嗎?

我遇到了類似的問題。 我想要測量並記錄通過NHibernate的所有查詢。 我做的是我寫了一個自定義的批處理工廠(在這種情況下我使用oracle)但你可以將相同的技術應用於任何db:

1-)實施配料工廠,(在這種情況下,我正在擴展現有工廠)

public class OracleLoggingBatchingBatcherFactory : OracleDataClientBatchingBatcherFactory
{
    public override IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor)
    {
        return new OracleLoggingBatchingBatcher(connectionManager, interceptor);
    }
}

2-)實現Batcher本身(在這種情況下,我正在擴展現有的batcher)。 確保再次繼承IBatcher,因為我們希望調用新方法

public class OracleLoggingBatchingBatcher : OracleDataClientBatchingBatcher, IBatcher
{
      .... // here override ExecuteNonQuery, DoExecuteBatch and ExecuteReader. 
           //You can do all kind of intercepting, logging or measuring here
           //If they are not overrideable just implement them and use "new" keyword if necessary
           //since we inherit IBatcher explicitly it will work polymorphically.
           //Make sure you call base implementation too or re-implement the method from scratch
}

3-)通過NHibernate配置注冊工廠:

    <property name="adonet.factory_class">OracleLoggingBatchingBatcherFactory, MyAssembly</property>

暫無
暫無

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

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