私は以下を必要とするプロジェクトに取り組んでいます:
- 特定の 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 内に自分自身を挿入します。私のサーバーではまだ試していませんが、そのような思い切った手段を使用するのは少し心配です。ただし、他に何も機能しない場合は、検討する必要があると思います。
提案?
今、私は最善の方法を選択することに少し行き詰まっています。他の提案があれば、ぜひ聞きたいです。