1

私は以下を必要とするプロジェクトに取り組んでいます:

  • 特定の NHibernate 3.2 セッションから完全な SQL クエリを抽出します。
  • クエリに対して特定のアクションを実行する (つまり、必ずしもログに記録しない)
  • パフォーマンスの問題の発生を避けるために、システム全体で NHibernate に影響を与えないでください

いくつかのアプローチを確認しましたが、それらの多くは既に StackOverflow に表示されています。私が今見ている私のオプションは次のとおりです。

マニュアル

最も素朴で厄介な解決策では、ビジネス ロジックに従って自分でクエリを作成することができます。たとえば、BL が ID=5 の制限を行う条件を作成する場合、SELECT ... WHERE ID = 5. かなり複雑な BL があるので、それは避けたいと思います。

NHibernate インターセプト

当初は、 を使用するのOnPrepareStatementが最善の策のように思えました。しかし、すぐに、クエリのパラメーターがログに記録されないため、まったく役に立たないことがわかりました

NHibernarnate の ICriteria を内省する

NHibernate でクエリを実行するときは、制限、並べ替え、および集計の定義を含む ICreteria オブジェクトを使用して実行します。ここに記載されている CriteriaWalker の場合、インタースペクトできるようです。ただし、複雑なクエリでは混乱するようです。また、場合によっては、このソリューションが役に立たない NHibernate 3 の新しい「QueryOver」構文を使用します。

ILoggerFactory の使用

NHibernate 3 以降、カスタム ログ ファクトリ ( sample )を記述できます。これは完全な SQL を取得しますが、NHibernate システム全体にも影響し、特定の ISession や ISessionFactory に適用するファクトリを持つことは不可能のようです。

カスタム NHibernate ドライバー

プロキシ NHibernate ドライバーを作成し、それを特定の SessionFactory に割り当てることを検討しました (ここで説明されているように)。ただし、友好的なコメントは、Nhibernate 3.2 では機能しなくなったことを警告しています。

動的プロキシの使用

このコードは、Castle の動的プロキシを使用して ISession 内に自分自身を挿入します。私のサーバーではまだ試していませんが、そのような思い切った手段を使用するのは少し心配です。ただし、他に何も機能しない場合は、検討する必要があると思います。

提案?

今、私は最善の方法を選択することに少し行き詰まっています。他の提案があれば、ぜひ聞きたいです。

4

1 に答える 1

2

標準またはカスタムのログ フレームワークを使用し、カスタム フィルターを適用して (たとえば) スレッド データからフラグを取得し、セッションをログに記録する必要があるかどうかを判断します。

この方法では、NH の内部をまったくいじらず、フラグを設定しない限り、何もログに記録されません。

于 2013-03-29T19:09:15.500 に答える