3

Java でスタック トレースを記録します。

new Throwable.printStackTrace()

Hibernate によって発行された SQL ステートメントを表示するには、show_sql を true に設定します

しかし、SQL クエリが発行されるたびにスタック トレースをログに記録するにはどうすればよいでしょうか。これをパフォーマンスの監視に使用したいと思います (つまり、ソース コードのどの部分が最も多くのクエリを生成するかを調べます)。

インターセプターとイベントリスナーを調べましたが、クエリレベルでフックを提供するものはないようです。

ソース(SQLStatementLogger、Loader)も少し調べました。フックは見えません。

ロギング jdbc driverを試すこともできますが、呼び出し元のスタックが適切に保存されるかどうかは不明です。

バイトコードを書き換えることはできましたが、それはやり過ぎのようです。

編集: AspectJを試して、SQL実行方法をアドバイスすることもできます。

誰かがこれをしましたか?最善の方法は何ですか?

4

1 に答える 1

2

Hibernate 3.6.8 で org.hibernate.jdbc.util.SQLStatementLogger (および他のクラスなし) で使用される org.hibernate.SQL ロガーに新しいログ Appender を添付することになりました。

Logger logger = Logger.getLogger("org.hibernate.SQL");
org.apache.log4j.rolling.RollingFileAppender appender =
    new org.apache.log4j.rolling.RollingFileAppender();
appender.setLayout(new SqlLogLayout());
// .. set appender options ..
appender.activateOptions();
logger.addAppender(appender);

次に、SqlLogLayout でスタック トレースと、ログ メッセージから取得した SQL を取得できます。

于 2012-08-28T18:03:16.887 に答える