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
:仅记录SQLjdbc.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日志记录相关推荐
- EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...
- Spring / Hibernate应用程序的性能调优
对于大多数典型的Spring / Hibernate企业应用程序,应用程序性能几乎完全取决于其持久层的性能. 这篇文章将讨论如何确认我们是否存在"数据库绑定"应用程序,然后逐步讲解 ...
- jboss7 关闭日志打印_使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句
jboss7 关闭日志打印 使用ORM从您的特定数据库中提取数据并让其创建和发布您必须亲自编写的所有SQL语句似乎很方便. 这就是使ORM解决方案受欢迎的原因. 但是它也有一个缺点:由于ORM为您做了 ...
- 使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句
使用ORM从您的特定数据库中提取数据,并让它创建和发布您必须亲自编写的所有SQL语句似乎很方便. 这就是使ORM解决方案受欢迎的原因. 但是它也有一个缺点:由于ORM为您做了很多工作,因此您在某种程度 ...
- 【Spring Boot】Spring Boot Logging 示例 | 日志记录
文章目录 logging.level | 设置日志级别 logging.file | 指定输出日志文件的路径和名称 logging.path | 指定输出日志文件的路径 logging.pattern ...
- mysql的事务隔离级别与锁的关系、sql日志、Spring事务的特性
文章目录 数据库事务介绍 什么是事务的隔离级别? 脏读幻读不可重复读的示例? mysql默认的隔离级别 Mysql锁有哪些 for update 什么是间隙锁?(Next-Key) mysql的日志 ...
- Spring Hibernate JPA 联表查询 复杂查询
(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...
- SSH(Struts,Spring,Hibernate )和SSM(SpringMVC,Spring,MyBatis )的区别,抽丝剥茧的给你讲清楚
SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...
- struts2+spring+hibernate
---恢复内容开始--- Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sessio ...
最新文章
- Cloudify — 系统架构
- ibatis如何支持clob 和blob
- C语言实现Hanoi算法塔的功能(附完整源码)
- 适合小白了解学习的DevOps实践
- 一篇年薪60万的JVM性能调优文章
- MS CRM 2011 如何创建基于SQL的自定义报表,并使用数据预筛选(Pre-Filtering)
- LeetCode(257)——二叉树的所有路径(JavaScript)
- vue 中watch函数名_vue中watch的使用
- 编程基本功:写一个JAVA版的对象回收利用机制
- matlab热应力计算,Matlab在齿轮应力计算中的应用
- 计算机网络的现状分析,计算机网络技术的发展现状和趋势分析.doc
- cc2430的中文资料
- Java最常见208道面试题:Java大土豆答案
- Soul网关源码阅读06-使用zookeeper同步数据(01)
- vue element-ui 界面有上下两部分table,拉动改变上下区域大小 关键代码
- java安装完后桌面怎么没有快捷方式_关于Eclipse在文件夹可以打开,在桌面建立快捷方式却无法打开的问题...
- win10 网络重置
- 压力测试常用专业名词解释
- 12306火车票查询
- 安装、配置 Java JDK 和 JRE,并卸载自带 OpenJDK
热门文章
- @ResponseBody导致的返回值中文乱码
- ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- 二叉树:HDU1754
- 使用vo注释做一个poi导出功能
- java设计模式代理模式_Java中的代理设计模式
- jcmd_jcmd,大约JDK 11
- spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
- lambda 匿名内部类_Lambda运行时内部:窥视无服务器巢穴
- java ee的小程序_Java EE调度程序