[英]NHibernate HiLo ID generator is performing a round-trip to the database per-row inserted
[英]NHibernate and interceptors - measuring/monitoring SQL round-trip times
為了獲得緩慢或潛在緩慢區域的早期警告,我想要一個可以作為性能監視器的NHibernate Interceptor,這樣任何超過給定時間的數據庫操作都會引發一個事件和(重要的是)應用程序日志中的完整堆棧跟蹤。
攔截器似乎是一個很好的窗口。 但是,經過實驗,似乎沒有任何方法可以捕獲“剛從SQL返回”事件:
OnPreFlush
和OnPostFlush
適用於涉及寫入的完整批處理,但不會在讀取事件上調用。 OnPrepareStatement()
似乎是最好的開始測量,但要停止? OnLoad
可能是停止時鍾的地方,但它被稱為每個實體返回一次 - 我如何知道何時到達所有實體的末尾? OnPostFlush
和OnAfterTransaction
;我得到印象OnSave
, OnFlushDirty
等在實際數據庫調用發生之前被調用 - 很高興成為雖然糾正了)。 據我所知,文檔嚴重缺乏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.