對於一個像兄弟一樣工作的安全系統(比如監視強制訪問控制),我們必須攔截並處理hibernate產生的所有選擇語句。我們將用戶,時間戳和sql select存儲在數據庫中,以便使用其他工具進行分析。這些信息可以確定用戶試圖查看的內容。對於select語句,準備好的屬性是有價值的。我們需要包含所有參數的完整SQL語句。如何攔截Hibernate生成的SQL?
有沒有我們可以加入和處理所有這些事情的監聽器或攔截器?迄今爲止最大的突出問題是收集語句參數。
謝謝
對於一個像兄弟一樣工作的安全系統(比如監視強制訪問控制),我們必須攔截並處理hibernate產生的所有選擇語句。我們將用戶,時間戳和sql select存儲在數據庫中,以便使用其他工具進行分析。這些信息可以確定用戶試圖查看的內容。對於select語句,準備好的屬性是有價值的。我們需要包含所有參數的完整SQL語句。如何攔截Hibernate生成的SQL?
有沒有我們可以加入和處理所有這些事情的監聽器或攔截器?迄今爲止最大的突出問題是收集語句參數。
謝謝
當日志級別爲org.hibernate package is set to DEBUG, and with the hibernate.show_sql property set.時,實際參數值碰巧可用(至少據我所知)如果您想在數據庫本身中使用記錄器輸出,請使用JDBCAppender。
或者,你可以看看的log4jdbc project,號稱如下:
在記錄的輸出,爲準備 語句,綁定參數是 自動插入SQL 輸出。這極大地提高了 可讀性和調試的許多 個案。
如果這不合適,您可以調查是否P6Spy can be used in your situation。在WebLogic Server上,通過WebLogic JDBC Spy可以實現等效功能,該功能是爲特定數據庫提供的WebLogic JDBC驅動程序的開箱即用功能。這兩個都寫入到System.out而不是數據庫(除非我錯了),所以它可能沒有那麼有用。
這非常有效,我寫了自己的appender來向數據庫寫入語句。唯一站在我的路上的是如何讓相應的用戶發起這個聲明。這幾乎不可能解決。有任何想法嗎? – codevour 2010-08-05 08:37:15
我對此並不確定,因爲我還沒有嘗試過。基本上,您需要將正在執行SQL語句的用戶/主體映射到正在記錄的數據。在SLF4J/log4j/logback中,這是通過MDC - Mapped Diagnostic Context實現的。您的模式字符串也需要修改以適應委託人。關於讓MDC在logback中工作的文章可能有所幫助 - http://logback.qos.ch/manual/mdc.html順便說一下,如果可以修改appender模式字符串以反映用戶,那麼您不需要MDC (如果這是缺少格式字符串的情況)。 – 2010-08-05 09:43:52
非常感謝你,我選擇了log4jdbc項目,因爲它是最活躍的項目,結果非常好。再次感謝。 – codevour 2010-08-06 11:40:12
mkyong聲稱p6spy.jar將顯示具有參數值的hibernate查詢。也許你可以試試這個http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/ – Naveen 2010-08-04 07:52:40