2010-08-04 44 views
6

對於一個像兄弟一樣工作的安全系統(比如監視強制訪問控制),我們必須攔截並處理hibernate產生的所有選擇語句。我們將用戶,時間戳和sql select存儲在數據庫中,以便使用其他工具進行分析。這些信息可以確定用戶試圖查看的內容。對於select語句,準備好的屬性是有價值的。我們需要包含所有參數的完整SQL語句。如何攔截Hibernate生成的SQL?

有沒有我們可以加入和處理所有這些事情的監聽器或攔截器?迄今爲止最大的突出問題是收集語句參數。

謝謝

+0

mkyong聲稱p6spy.jar將顯示具有參數值的hibernate查詢。也許你可以試試這個http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/ – Naveen 2010-08-04 07:52:40

回答

3

當日志級別爲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而不是數據庫(除非我錯了),所以它可能沒有那麼有用。

+0

這非常有效,我寫了自己的appender來向數據庫寫入語句。唯一站在我的路上的是如何讓相應的用戶發起這個聲明。這幾乎不可能解決。有任何想法嗎? – codevour 2010-08-05 08:37:15

+1

我對此並不確定,因爲我還沒有嘗試過。基本上,您需要將正在執行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

+0

非常感謝你,我選擇了log4jdbc項目,因爲它是最活躍的項目,結果非常好。再次感謝。 – codevour 2010-08-06 11:40:12

3

您可以使用Interceptor.prepareSQL()(3.1+)攔截準備好的聲明。

我不認爲你可以得到實際的參數,而不會在抽象層下去。可能的解決方案是使用JDBC代理驅動程序(請參閱P6Spy)。

希望有所幫助。

+0

是的,知道這個接口,在哪裏得到有界參數?據我所知,沒有辦法得到實際的參數。 – codevour 2010-08-04 07:22:23

+0

確切地說,它是'Interceptor#onPrepareStatement(String sql)'。但是,這使您可以訪問正在準備的SQL字符串,而不是*生成的*查詢。 – 2010-08-04 08:11:41