在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执行方法。
有人这样做过吗?什么是最好的方式?
答案 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。