javascript
Spring / Hibernate使用log4jdbc改进了SQL日志记录
Hibernate提供了開箱即用的SQL日志記錄,但是這種日志記錄僅顯示準備好的語句,而不顯示發送到數據庫的實際SQL查詢。
它還不會記錄每個查詢的執行時間,這對于性能故障排除很有用。 這篇博客文章將介紹如何設置Hibernate查詢日志記錄,然后將其與可以通過log4jdbc獲得的日志記錄進行比較。
Hibernate查詢日志記錄功能
Hibernate不會記錄發送到數據庫的實際SQL查詢。 這是因為Hibernate通過JDBC驅動程序與數據庫進行交互,它向其發送準備好的語句,但不發送實際的查詢。
因此,Hibernate只能記錄準備好的語句及其綁定參數的值,而不能記錄實際的SQL查詢本身。
這是由Hibernate登錄時查詢的外觀:
select /* load your.package.Employee */ this_.code, ... from employee this_ where this_.employee_id=?TRACE 12-04-2014@16:06:02 BasicBinder - binding parameter [1] as [NUMBER] - 1000請參閱本文, 為什么Hibernate在哪里以及在哪里進行此SQL查詢? 有關如何設置此類日志記錄的信息。
使用log4jdbc
對于開發人員而言,能夠從日志中復制粘貼查詢并能夠直接在SQL客戶端中執行查詢非常有用,但是變量占位符是? 使其不可行。
開源工具中的Log4jdbc可以做到這一點,甚至更多。 Log4jdbc是一個間諜驅動程序,它將自身包裹在真正的JDBC驅動程序中,并記錄查詢過程中的查詢。
與其他幾個log4jdbc分支不同,本文中鏈接的版本提供了Spring集成。
設置log4jdbc
首先在您的pom.xml中包含log4jdbc-remix庫。 該庫是原始log4jdbc的分支:
<dependency><groupId>org.lazyluke</groupId><artifactId>log4jdbc-remix</artifactId<version>0.2.7</version> </dependency>接下來,在Spring配置中找到數據源的定義。 例如,使用JNDI查找元素時,數據源的外觀如下:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/some-db" />找到數據源定義后,將其重命名為以下名稱:
<jee:jndi-lookup id="dataSourceSpied" jndi-name="java:comp/env/jdbc/some-db" />然后定義一個新的log4jdbc數據源,該數據源包裝了真實的數據源,并為其指定了原始名稱:
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource" > <constructor-arg ref="dataSourceSpied" /> <property name="logFormatter"> <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter" ><property name="loggingType" value="SINGLE_LINE" /><property name="margin" value="19" /> <property name="sqlPrefix" value="SQL:::" /> </bean> </property> </bean >使用此配置,查詢日志記錄應該已經可以工作了。 可以自定義幾個可用的log4jdbc記錄器的記錄級別。
log4jdbc原始文檔提供了有關可用記錄器的更多信息:
- jdbc.sqlonly :僅記錄SQL
- jdbc.sqltiming :記錄SQL,執行后,包括定時執行統計信息
- jdbc.audit :記錄除結果集外的所有JDBC調用
- jdbc.resultset :記錄對ResultSet對象的所有調用
- jdbc.connection :記錄連接打開和關閉事件
jdbc.audit記錄器對于記錄事務范圍特別有用,因為它記錄了數據庫事務的開始/提交/回滾事件。
這是建議的log4j配置,將僅打印SQL查詢及其執行時間:
<logger name="jdbc.sqltiming" additivity ="false"> <level value="info" /> </logger> <logger name="jdbc.resultset" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.audit" additivity ="false"><level value="error" /> </logger> <logger name="jdbc.sqlonly" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.resultsettable" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.connection" additivity ="false"> <level value="error" /> </logger> <logger name="jdbc.resultsettable" additivity ="false"> <level value="error" /> </logger>結論
使用log4jdbc只是進行一些初始設置,但是一旦安裝到位,便非常方便。 擁有真實的查詢日志對于性能故障排除也很有用,這將在以后的文章中進行介紹。
翻譯自: https://www.javacodegeeks.com/2014/06/springhibernate-improved-sql-logging-with-log4jdbc.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring / Hibernate使用log4jdbc改进了SQL日志记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杠杆原理的完整公式是什么 杠杆原理的完整
- 下一篇: Spring Integration 4