2012-08-27 122 views
2

記錄堆棧跟蹤Java中:如何在Hibernate發出SQL查詢時記錄堆棧跟蹤?

new Throwable.printStackTrace() 

要查看由Hibernate,set show_sql to true發出SQL語句。

但是,如何在每次發出SQL查詢時記錄堆棧跟蹤?我想用它來進行性能監控(即查找我們的源代碼的哪一部分產生最多的查詢)。

我看着interceptors and event listeners,他們都沒有在查詢層面給出一個掛鉤。

我還通過源代碼(SQLStatementLogger,Loader)進行了一番觀察。我沒有看到任何鉤子。

我也許可以嘗試一個logging jdbc driver,但是我不清楚調用者的堆棧是否能夠正確保存。

我可以rewrite byte code,但這似乎過分。

編輯:我也可以嘗試AspectJ來通知SQL執行方法。

有沒有人這樣做?最好的方法是什麼?

回答

2

我最終在Hibernate 3.6.8中將一個新的日誌Appender附加到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我從日誌消息得到。

+0

應標記爲接受解決方案 – AvrDragon

相關問題