前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >老王,怎么完整SQL的显示日志,而不是???...

老王,怎么完整SQL的显示日志,而不是???...

作者头像
用户5224393
发布于 2019-10-16 05:45:35
发布于 2019-10-16 05:45:35
1.4K00
代码可运行
举报
文章被收录于专栏:Java研发军团Java研发军团
运行总次数:0
代码可运行

在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 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 配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbcXX</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>

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

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

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

例如原来的 JDBC URL 是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 jdbc:mysql://localhost:3306/MyDatabase

,则应该改成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 里面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 来记录和打印日志,在该配置文件里增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

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

# 效果

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

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java研发军团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c语言xml解析器libxm2
写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如何解决中文问题。
全栈程序员站长
2022/09/14
2.8K0
C语言xml文件存储数据文件(一)
———————————————— 版权声明:本文为CSDN博主「jack8126」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jack8126/article/details/117004179
全栈程序员站长
2022/09/14
1.2K0
XML解析方式及GData框架使用一、概念二、XML解析SAM方式(只读)三、DOM方式解析(可读写)四、GData写入功能,生成XML
一、概念 1、XML概念: Extensible Markup Language(可扩展标记语言) HTML (超文本标记语言) 非常类似于HTML,HTML的作用是显示数据,XML的目的是存储和传输数据 XML是以前各种应用之间传输数据最常用的格式 W3C的推荐标准 2、语法 <Class className="三年一班"> <Person color="yellow" weight="130" height="150"> <name>wg</name> <age>108</
用户2141756
2018/05/18
1.2K0
C语言xml配置文件换行的方法[通俗易懂]
/options参数设定成XML_PARSE_NOBLANKS,否则的话是不会在结点后面添加回车的。/
全栈程序员站长
2022/09/14
1.9K0
libxml2编译_etc在哪里安装
本文着重介绍解析xml的libxml2库的安装及使用,举例说明创建和解析xml的过程。是针对C语言开发人员使用
全栈程序员站长
2022/11/03
2.9K0
深入解读Python解析XML的几种方式
本文将介绍深入解读利用Python语言解析XML文件的几种方式,并以笔者推荐使用的ElementTree模块为例,演示具体使用方法和场景。文中所使用的Python版本为2.7。 在XML解析方面,Py
CDA数据分析师
2018/02/05
2.8K0
深入解读Python解析XML的几种方式
tinyXml解析XML文件
TinyXML解析一个XML文档,并从该文档构建可读取、修改和保存的文档对象模型(DOM)。
全栈程序员站长
2022/07/01
1.4K0
tinyXml解析XML文件
python读取xml文件
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
py3study
2020/01/10
4K0
iOS-网络编程(一)HTTP协议
一. 网络编程基础 在移动互联网时代,几乎所有应用都需要用到网络,只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜、活力。一个好的移动网络应用不仅要有良好的UI和良好的用户体验也要具备实时更新数据的能力。网络编程便是一种实时更新应用数据的常用手段也是开发优秀网络应用的前提和基础。 1. 在网络编程中,有几个必须掌握的基本概念 客户端(Client):移动应用(iOS、android等应用) 服务器(Server):为客户端提供服务、提供数据、提供资源的机器 请求(Request):客户端向服务
xx_Cc
2018/05/10
1.7K0
Java中XML运用总结
5.名称区分大小写 标记内容: 开始标记与结束标记之间 ,是标记的内容. 例如 ,我们通过标记, 描述一个人名:
全栈程序员站长
2022/07/18
1.2K0
Java中XML运用总结
从零开始学XML(修订版)
XML:extensiable markup language 被称作可扩展标记语言
Java3y
2019/08/27
2K0
从零开始学XML(修订版)
浅谈JAVA解析XML的方法
XML是什么?XML是可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
程序员云帆哥
2022/05/12
5410
[935]python解析xml文件
XML 指可扩展标记语言(eXtensible Markup Language)。
周小董
2021/01/29
1.5K0
JavaWeb08-XML,tomcat,HTTP轻松入门
XML&tomcat&HTTP 一.XML基础知识 1. xml介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言,很类似 HTML.它的设计宗旨是传输数据,而非显示数据它;标签没有被预定义,需要自行定义标签。 XML 被设计为具有自我描述性,是 W3C 的推荐标准,在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
Java帮帮
2018/03/16
1.1K0
JavaWeb08-XML,tomcat,HTTP轻松入门
XML和PHP
1、XML知识 Xml就是可扩展标记语言与html一样,都是通用标记语言。 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
苦咖啡
2018/05/07
1.6K0
[Java拾遗一] XML的书写规范与解析.
前言 今天天气大好, 起了个大早开始总结一些常用的基础知识. XML一直来说都很陌生, 使用大多是用于配置文件, 之前并没有细究过其中的约束规范, 今天刚好没事来学习并总结下.  ---- 1,XML基础介绍   XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言,很类似 HTML.它的设计宗旨是传输数据,而非显示数据它;标签没有被预定义,需要自行定义标签。   xml的作用:     XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描
一枝花算不算浪漫
2018/05/18
1.7K0
Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)
游戏开发小Y
2024/01/18
6230
iOS - - JSON 和 XML解析
JSON 和 XML 一、JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从JSON中挖掘出具体数据,得对JSON进行解析 JSON OC 大括号{} NSDictionary
用户1941540
2018/05/11
2.4K0
Python操作xml
Xml XML指可扩展标记语言(Extensible Markup Language) XML被设计用于结构化、存储和传输数据 XML是一种标记语言,很类似于HTML XML没有像HTML那样具有预定义标签,需要程序员自定义标签。 XML被设计为具有自我描述性,并且是W3C的标准 XML元素 XML的元素是指从开始标签直到结束标签的部分(均包括开始结束)。 一个元素可以包含: 1、其他元素 2、文本 3、属性 4、或混合以上所有 XML语法规则 所有的XML元素都必须有一个开始标签和结束标签,
py3study
2020/01/10
2.4K0
编码篇-使用GDataXMLNode解析XML数据
在实际的开发中数据解析是很普遍的事,一般网络请求返回的数据有两种格式:XML和JSON。关于JSON的解析已是主流,满大街的解析方式。而XML的数据格式确实是很少接触到了,但是最近项目确实接触到了,本文就使用 GDataXMLNode解析XML数据 做一个小结。
進无尽
2018/09/12
1.3K0
编码篇-使用GDataXMLNode解析XML数据
相关推荐
c语言xml解析器libxm2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验