Hibernate provides SQL logging out of the box, but such logging only shows prepared statements, and not the actual SQL queries sent to the database.

It also does not log the execution time of each query, which is useful for performance troubleshooting. This blog post will go over how to setup Hibernate query logging, and then compare it to the logging that can be obtained with log4jdbc .

The Hibernate query logging functionality

Hibernate does not log the real SQL queries sent to the database. This is because Hibernate interacts with the database via the JDBC driver, to which it sends prepared statements but not the actual queries.

So Hibernate can only log the prepared statements and the values of their binding parameters, but not the actual SQL queries themselves.

This is how a query looks like when logged by Hibernate:

1.select /* load your.package.Employee */ this_.code, ...
2.from employee this_
3.where this_.employee_id=?
4. 
5.TRACE 12-04-2014@16:06:02  BasicBinder - binding parameter [1] as [NUMBER] - 1000

See this post Hibernate Debugging - Finding the origin of a Query  for how to setup this type of logging.

Using log4jdbc

For a developer it's useful to be able to copy paste a query from the log and be able to execute the query directly in an SQL client, but the variable placeholders ? make that unfeasible.

Log4jdbc in an open source tool that allows to do just that, and more. Log4jdbc is a spy driver that will wrap itself around the real JDBC driver, logging queries as they go through it.

The version linked from this post provides Spring integration, unlike several other log4jdbc forks.

Setting up log4jdbc

First include the log4jdbc-remix library in your pom.xml. This library is a fork of the original log4jdbc:

1.<dependency>
2.<groupId>org.lazyluke</groupId>
3.<artifactId>log4jdbc-remix</artifactId
4.<version>0.2.7</version>
5.</dependency>

Next, find in the Spring configuration the definition of the data source. As an example, when using the JNDI lookup element this is how the data source looks like:

1.<jee:jndi-lookup id="dataSource"
2.jndi-name="java:comp/env/jdbc/some-db" />

After finding the data source definition, rename it to the following name:

1.<jee:jndi-lookup id="originalDataSource"
2.jndi-name="java:comp/env/jdbc/some-db" />

Then define a new log4jdbc data source that wraps the real data source, and give it the original name:

01.<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">        
02.<constructor-arg ref="originalDataSource" />        
03.<property name="logFormatter">                   
04.<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter" >
05.<property name="loggingType" value="SINGLE_LINE" />
06.<property name="margin" value="19" />  
07.<property name="sqlPrefix" value="SQL:::" />           
08.</bean>           
09.</property>    
10.</bean>

With this configuration, the query logging should already be working. It's possible to customize the logging level of the several log4jdbc loggers available.

The original log4jdbc documentation provides more information on the available loggers:

  • jdbc.sqlonly: Logs only SQL
  • jdbc.sqltiming: Logs the SQL, post-execution, including timing execution statistics
  • jdbc.audit: Logs ALL JDBC calls except for ResultSets
  • jdbc.resultset: all calls to ResultSet objects are logged
  • jdbc.connection: Logs connection open and close events

The jdbc.audit logger is especially useful to validate the scope of transactions, as it logs the begin/commit/rollback events of a database transaction.

This is the proposed log4j configuration that will print only the SQL queries together with their execution time:

01.<logger name="jdbc.sqltiming" additivity ="false">            
02.<level value="info" />               
03.</logger> 
04.<logger name="jdbc.resultset" additivity ="false">             
05.<level value="error" />       
06.</logger> 
07.<logger name="jdbc.audit" additivity ="false">
08.<level value="error" />       
09.</logger>  
10.<logger name="jdbc.sqlonly" additivity ="false">             
11.<level value="error" />       
12.</logger>  
13.<logger name="jdbc.resultsettable" additivity ="false">          
14.<level value="error" />      
15.</logger>          
16.<logger name="jdbc.connection" additivity ="false">             
17.<level value="error" />       
18.</logger> 
19.<logger name="jdbc.resultsettable" additivity ="false">           
20.<level value="error" />       
21.</logger>

Conclusion

Using log4jdbc does imply some initial setup, but once it's in place it's really convenient to have. Having a true query log is also useful for performance troubleshooting (to be described in a future post).

reference from:http://java.dzone.com/articles/springhibernate-improved-sql

Spring/Hibernate Improved SQL Logging with log4jdbc---reference的更多相关文章

  1. Performance Tuning of Spring/Hibernate Applications---reference

    http://java.dzone.com/articles/performance-tuning For most typical Spring/Hibernate enterprise appli ...

  2. Spring/Hibernate 应用性能优化的7种方法

    对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能.此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法.本文系 O ...

  3. Spring / Hibernate 应用性能调优

    来源:ImportNew - 陈晓舜 对大部分典型的Spring/Hibernate企业应用来说,应用的性能大部分由持久层的性能决定. 这篇文章会重温一下怎么去确认我们的应用是否是”数据库依赖(dat ...

  4. Servlet开发 中使用 log4jdbc 记录 hibernate 的 SQL信息

    一.前言 使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况. 平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺 ...

  5. Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目

    作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...

  6. spring+hibernate常见异常集合

    spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...

  7. 软件架构期末复习(Struts2+Spring+Hibernate)

    Struts2+Spring+Hibernate The Model-ViewController pattern in Struts2 is implemented with the followi ...

  8. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  9. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

随机推荐

  1. hdu 1116

    欧拉回路,利用并查集来实现: 代码: #include<cstdio> #include<cstring> #include<vector> using names ...

  2. Tmux:终端复用器

    转自Tmux:终端复用器 Tmux 是一个 C 语言编写的终端,它能够在单一窗口中同时访问和控制多个终端.它是一个类似于GNU Screen 的工具.使用它,用户可以在 Linux 系统上管理多个任务 ...

  3. ASP.NET Web API 2 入门(一)

    前言 HTTP 不是只是为了服务的 web 页.这也是建设公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以 ...

  4. Mozilla研究—深入理解mozilla所需的背景知识

    mozilla是一个以浏览器为中心的软件平台,它在我们平台中占有重要地位.我们用它来实现WEB浏览器.WAP浏览器.邮件系统.电子书和帮助阅读器等应用程序.为此,我最近花了不少时间去阅读mozilla ...

  5. 机器学习10大经典算法.doc

    详见 F:\工程硕士\d电子书\26 数据挖掘 小结: 1. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法.  C4.5算法继承了ID3算法的优点,并在以下几方面 ...

  6. MySQL5.6 基于db的并行复制

    slave的几个类结构:      Master_info:用于IO线程的参数,包括连接master实例的信息.      Relay_log_info:用于sql线程,表示relay log相关的信 ...

  7. bzoj3091

    最近屯题都忘了把解题报告写上了这道题是一道比较烦的LCT,我们先考虑每个点上到底要维护什么我们设路径上有n个点,从起点到终点编号为1~n显然期望=S/[(n+1)n div 2]S=∑a[i]*i*( ...

  8. App架构经验总结(转)

    原文链接: http://keeganlee.me/post/architecture/20160303 架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构 ...

  9. ASP.NET(C#) GridView (编辑、删除、更新、取消)

    转自:http://my.oschina.net/dldlhrmc/blog/93458 前台代码 view source   print? 01 <%@ Page Language=" ...

  10. ArcServer,ArcSDE,ArcIMS,ArcEngine

    ArcServer,ArcSDE,ArcIMS,ArcEngine是ESRI的四种产品ArcGIS Server 与 ArcIMS功能相似,是将地图发布成服务供调用的ArcSDE 是空间数据引擎,是将 ...