Hibernate发出SQL查询时如何记录堆栈跟踪?

时间:2012-08-27 18:16:37

标签: sql hibernate logging

在Java中记录堆栈跟踪:

new Throwable.printStackTrace()

要查看Hibernate发出的SQL语句set show_sql to true

但是,每次发出SQL查询时如何记录堆栈跟踪?我想将它用于性能监控(即查找源代码的哪些部分产生最多的查询)。

我查看了interceptors and event listeners,但似乎没有人在查询级别提供钩子。

我也稍微查看了源代码(SQLStatementLogger,Loader)。我没有看到任何钩子。

我或许可以试一下logging jdbc driver,但我不清楚调用者的堆栈是否会被正确保存。

我可以rewrite byte code,但这似乎过分了。

编辑:我还可以尝试AspectJ建议SQL执行方法。

有人这样做过吗?什么是最好的方式?

1 个答案:

答案 0 :(得分:2)

我最终将新的日志Appender附加到hagnate 3.6.8中org.hibernate.jdbc.util.SQLStatementLogger(并没有其他类)使用的org.hibernate.SQL记录器。

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。