3

低速または潜在的に低速な領域の早期警告を取得するために、パフォーマンス モニターとして機能できる NHibernate のインターセプターが必要です。これにより、一定時間以上かかるデータベース操作がイベントを発生させ、(重要なこと) アプリケーションのログへの完全なスタック トレース。

インターセプターは、これに対する良い窓のように見えました。ただし、実験したところ、「SQL から戻るだけ」イベントをキャッチする方法はないようです。

  • OnPreFlushOnPostFlush書き込みが含まれる完全なバッチで動作しますが、読み取りイベントでは呼び出されません。
  • OnPrepareStatement()測定を開始するのに最適なようですが、停止するには?
  • 読み取りイベントの場合OnLoad、クロックを停止する場所になる可能性がありますが、返されるエンティティごとに 1 回と呼ばれます。
  • OnPostFlush書き込みイベントの場合、SQL 後のイベントは表示されません (バッチ全体で動作するものを除き、実際のデータベース呼び出しが発生する前に 、 などが呼び出されるという印象を受けますが、修正していただければ幸いです) OnAfterTransactionOnSaveOnFlushDirty

私が知る限り、NHibernate のデータベースとのやり取りでパイプラインの順序が正確に何であるかについてのドキュメントが大幅に不足しているため、そのパイプラインで実際の SQL 実行自体に関連してさまざまなイベントとインターセプター呼び出しが呼び出される場合があります。

これは、バックグラウンドに常駐する必要があり、遅いクエリが検出された場合を除いて、人間の介入をほとんど必要としないものです。また、大規模なサーバー ファームでヘッドレスで実行する必要があるため、NHibernate Profiler などのインタラクティブなツールは出てきました。

見逃したり誤解したりしたことはありますか?

4

1 に答える 1

3

同様の問題がありました。NHibernate を通過するすべてのクエリを測定してログに記録したかったのです。私がしたことは、カスタム バッチ ファクトリを作成したことです (この場合、私は oracle を使用しています) が、同じ手法を任意のデータベースに適用できます。

1-) バッチャー ファクトリを実装します (この場合、既存のファクトリを拡張します)。

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

2-) バッチャー自体を実装します (この場合、既存のバッチャーを拡張しています)。新しいメソッドを呼び出す必要があるため、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>
于 2014-03-11T10:30:58.910 に答える