3

在 Java 中记录堆栈跟踪:

new Throwable.printStackTrace()

要查看 Hibernate 发出的 SQL 语句,请将 show_sql 设置为 true

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

我查看了拦截器和事件侦听器,它们似乎都没有在查询级别提供挂钩。

我还浏览了源代码(SQLStatementLogger、Loader)。我没有看到任何钩子。

我也许可以尝试使用日志记录 jdbc 驱动程序,但我不清楚调用者的堆栈是否会被正确保留。

我可以重写字节码,但这似乎太过分了。

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

有人做过吗?最好的方法是什么?

4

1 回答 1

2

我最终将一个新的日志 Appender 附加到 Hibernate 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。

于 2012-08-28T18:03:16.887 回答