hibernate 执行sql在哪个类_老王,怎么完整SQL的显示日志
发布日期:2021-09-12 18:30:29 浏览次数:1 分类:技术文章

本文共 2943 字,大约阅读时间需要 9 分钟。

作者:peng来源:http://club.oneapm.com/t/java-sql/154

在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate 、 MyBatis 等。

由于各种原因,我们有时会想知道在这些框架下实际执行的 SQL 究竟是什么。

虽然 Hibernate 可以在配置文件中打开 SHOW SQL 的功能, MyBatis 则可以在 Log4j 的配置文件中配置 SQL 语句的输出,但这些输出是类似这样的 INSERT … ? ? ? 语句,并不是一个完整可以运行的 SQL ,要想知道完整的 SQL 需要手动把参数补齐,如果要调试这样的 SQL 无疑非常痛苦。

Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的 JDBC Driver( Oracle , Derby , MySQL , PostgreSQL , H2 , HSQLDB , …)操作的拦截,记录真实 SQL ,可以将占位符与参数全部合并在一起显示,方便直接拷贝 SQL 在 MySQL 等客户端直接执行,加快调试速度。

本文主要介绍如何使用 Log4jdbc 这个可以直接显示完整 SQL 的日志框架,希望对大家能有所帮助。

# Log4jdbc 的特点

Log4jdbc 的官方主页是 https://github.com/arthurblake/log4jdbc 4 ,它具有以下特点:

完全支持 JDBC3 和 JDBC4

配置简单,在大多数情况下,只需要将 JDBC 驱动类改成 net.sf.log4jdbc.DriverSpy ,同时将 jdbc:log4jdbc 添加到现有的 JDBC URL 之前,最后配置日志记录的种类即可

将 Prepared Statements 中的绑定参数自动插入到对应的位置。在大多数情况下极大改善了可读性及调试工作

SQL 的耗时信息能被获取从而帮助判断哪些语句执行得过慢,同时这些信息可以被工具识别得到一个关于慢 SQL 的报表

SQL 连接信息也可以获取从而帮助诊断关于连接池或线程的问题

兼容任何 JDBC 驱动,需要 JDK1.4 及以上与 Slf4j1.x

开源软件,使用 Apache 2.0 License

使用 Log4jdbc 的步骤

感兴趣的朋友可以去 Log4jdbc 的项目主页看它的使用方法,如果单纯使用 Log4jdbc ,不会对 ResultSet 以表格方式呈现,在这里我们使用扩展自 Log4jdbc 的日志框架 Log4jdbc-log4j2 ,它增加了对 ResultSet 以表格方式呈现的处理,项目主页是: https://code.google.com/p/log4jdbc-log4j2/ 3 。它的使用步骤如下:

1、决定使用哪个版本的 JAR 包:

如果使用 JDK1.5 , 应该使用 JDBC3 版本的 JAR 包即 log4jdbc-log4j2-jdbc3.jar

如果使用 JDK1.6 , 应该使用 JDBC4 版本的 JAR 包即 log4jdbc-log4j2-jdbc4.jar (即使实际使用的 JDBC 驱动是 JDBC3 的甚至更老)。

如果使用 JDK1.7 , 应该使用 JDBC4.1 版本的 JAR 包即 log4jdbc-log4j2-jdbc4.1.jar (即使实际使用的 JDBC 驱动是 JDBC3 的甚至更老)。

2、将 JAR 包添加进项目:

将 JAR 包添加进项目有两种方式,第一种是直接将 Log4jdbc-log4j2 和 Slf4j 的 JAR 包添加进 CLASSPATH 中,第二种是使用 MAVEN 方式引入 JAR 包,这里我们主要说明第二种方式。在 pom.xml 文件中,根据使用的 JDBC 驱动的版本来替换 log4jdbc-log4j2-jdbcXX (比如 log4jdbc-log4j2-jdbc4.1 , 或者 log4jdbc-log4j2-jdbc4 , 或者 log4jdbc-log4j2-jdbc3 )。该框架需要配合 Slf4j 一起使用,MAVEN 配置如下:

1fa792e19f9d3bc7d6f6b7362aae3e31.png

3、将项目的配置文件中的 JDBC 驱动类改成

net.sf.log4jdbc.sql.jdbcapi.DriverSpy 。

4、将 jdbc:log4 添加到现有的 JDBC URL 之前:

例如原来的 JDBC URL 是

jdbc:mysql://localhost:3306/MyDatabase

,则应该改成:

jdbc:log4jdbc:mysql://localhost:3306/MyDatabase

5、配置日志记录的种类:

Log4jdbc 用以下几个可以配置的日志种类:

1.jdbc.sqlonly : 仅记录 SQL

2.jdbc.sqltiming :记录 SQL 以及耗时信息

3.jdbc.audit :记录除了 ResultSet 之外的所有 JDBC 调用信息,会产生大量的记录,有利于调试跟踪具体的 JDBC 问题

4.jdbc.resultset :会产生更多的记录信息,因为记录了 ResultSet 的信息

5.jdbc.connection :记录连接打开、关闭等信息,有利于调试数据库连接相关问题

以上日志种类都可以设置为 DEBUG , INFO 或 ERROR 级别。当设置为 FATAL 或 OFF 时,意味关闭记录。

以下是一个采用 Log4j 作为具体日志系统的典型配置,将这些配置到

log4j.properties 里面:

log4j.logger.jdbc.sqlonly=OFF log4j.logger.jdbc.sqltiming=INFO log4j.logger.jdbc.audit=OFF log4j.logger.jdbc.resultset=OFF log4j.logger.jdbc.connection=OFF

6、添加 log4jdbc.log4j2.properties 文件:

这是最后一步,在项目的 CLASSPATH 路径下创建一个 log4jdbc.log4j2.properties 文件,告诉 Log4jdbc-log4j2 使用的是 Slf4j 来记录和打印日志,在该配置文件里增加:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

最后,运行一下项目,看看效果。

# 效果

a60e417cbe096b1ab006d551db3142e4.png

上图可以看出,两个 SELECT 语句的执行时间分别是 117 和 552 毫秒,这对于开发调试还是很有帮助的。现在很多的项目压测时和上线后,基本都在使用 OneAPM ,它的数据库监控 2分析功能更强大一些,不仅可以记录 SQL 日志,还可以定位到操作 SQL 的 Java 代码行,直接在网页上就可以看到效果,使用体验还是不错的。

转载地址:https://blog.csdn.net/weixin_39609822/article/details/110638611 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:er图一对多的关系怎么体现_考研专业课一对一辅导真的有用吗?
下一篇:java中int和integer的区别_这次彻底搞懂Java中equals和==的区别

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月28日 12时07分05秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

docker 部署java_docker 部署java环境以及常用应用(持续更新) 2019-04-21
jpmml导出java文件_JPMML解析PMML模型并导入数据进行分析生成结果 2019-04-21
java如何做表单校验_微信小程序实现表单校验功能 2019-04-21
php类里面调用函数吗,从PHP类中的另一个函数调用一个函数 2019-04-21
php7 ast,PHP7 的抽象语法树(AST)带来的变化,_PHP_ 少侠科技 2019-04-21
php 去掉json外层 方括号,从 JSON 中删除方括号 - WITHOUT_ARRAY_WRAPPER 选项 2019-04-21
windows 2003 php5.6,GitHub - d93921012/php-5.6-xp-2003: Run PHP 5.6+ on Windows XP and 2003 2019-04-21
php 微信支付宝提现,微信支付对接提现功能(php) 2019-04-21
php 薛强,PHP框架Yii系列教程(一):入门实例 2019-04-21
oracle的java包,oracle中程序包? 2019-04-21
php先学html,PHP入门学习–HTML01 2019-04-21
mysql中字符转数字,MYSQL字符数字转换为数字 2019-04-21
php框架laravel win10,Windows10搭建安装Laravel环境配置教程 2019-04-21
matlab dwt2(),MATLAB小波变换指令及其功能介绍(超级有用) 2019-04-21
php sequelize,egg.js整合数据库ORM框架Sequelize 2019-04-21
php同时打开2个数据库,thinkphp3.2同时连接两个数据库的简单方法 2019-04-21
centos 开发php扩展,centos 安装php扩展redis 2019-04-21
php+跑buth,php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的 2019-04-21
cms 单点登录 php,Yii2 中实现单点登录的方法 2019-04-21
oracle自己运行,创建Oracle自动执行Job 2019-04-21