現在のスレッド/セッションに対してのみHibernate SQLをログする最も簡単な方法

私は、Hibernateによって生成されたSQLクエリの実行時間をトレースする最も簡単な方法を探しています。
残念ながら、show_sqlやhibernate
loggerを設定するだけでは、従来の方法では実行できません。監視対象のアプリケーションが本番環境ではマルチスレッドであり、SQL時間トレースは1つのサービスに対してのみ実行される必要があります。
サービスとは、Springアプリケーション内で動作するコンポーネントのことです。しかし、私の場合は、呼び出し中にスレッドスレッドが変更されないことを伝えることは安全です。サービス実装はJavaメソッドであり、このメソッドは他のメソッド、コンポーネントなどをすべて1つのスレッドと呼びます。
1つのメソッドのソースを変更してデプロイすることは可能ですが、アプリケーションをリリースすることはできません。
残念ながらAspectJはそのままでは使用できません。アプリケーション全体を変更したり、JVMに何かを再コンパイルしたり、プラグインすることができないからです。
残念なことに(次の)DB管理者は、SQLクエリのトレースをオンにすることはできません。SQLクエリのトレース方法はわかりません。
アプリケーション全体を掘り下げずにHibernateの実行をチューニングする方法をお手伝いしてください。最も簡単な方法は何ですか?

事実:Hibernate 3.x、Spring 2.x、java 1.5

ベストアンサー

フィルタリング基準についてはあまり具体的ではありません.SQLをスレッド/ HTTPセッションまたは特定のサービス(
SQLトレースは1つのサービスに対してのみ実行する必要があります)でフィルタリングしますか?

それにもかかわらず、すべてはフレームワークレベルでログに記録できます。まず、すべてのクエリのログを有効にしてから、重要でないものを除外する必要があります。私はあなたが
Logback (BTW Spring 2.xとJava
1.5.xは時代遅れになっている)を使用していると仮定しています… ):

スレッドごと

ログバックを実装するには、フィルタし、興味のないスレッドからのログを破棄します。または、スレッドIDをキーとして
SiftingAppender
を使用してください。特定のスレッドからのすべてのログは、別のファイルにディスパッチされます。

HTTPセッションごと

This is a bit tricky because you need to get access to HTTP
session/session id from logging framework level. The easy way is to
use MDC (see example: Logging user activity
in web app
). Having session id you can do filtering similar to
スレッドごと section.

サービスごと

あなたは何を意味するのかは明らかではありません。特定のクラスから、または呼び出すすべてのメソッドとクラスおよびから発行されたSQLクエリのみをログに記録しますか?どちらの場合でも、フィルタリング中にコールスタックを調べる必要があります。これはあまり効果的ではありません。また、AspectJは
within という指示を持っています。

これがあなたの質問を明確にしておきたい場合は、他にもいくつかのアイディアがあります。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です