为你的 项目安装Sql跟踪工具-P6Spy

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 我们在项目中有时候需要跟踪记录sql的执行情况,有时候跟踪的日志中的sql是预编译之后的,参数是带问号的,所以我们需要跟踪到真正的sql执行语句,P6spy正好可以满足我们的需要。先来看一下P6Spy的介绍: P6Spy 是针对数据库访问操作的动态监测框架(为开源项目,github地址为https://github.com/p6spy/p6spy)它使得数据库数据可无缝截取和操纵,而不必

我们在项目中有时候需要跟踪记录sql的执行情况,有时候跟踪的日志中的sql是预编译之后的,参数是带问号的,所以我们需要跟踪到真正的sql执行语句,P6spy正好可以满足我们的需要。先来看一下P6Spy的介绍:

P6Spy 是针对数据库访问操作的动态监测框架(为开源项目,github地址为https://github.com/p6spy/p6spy)它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改。P6Spy分发包包括P6Log,它是一个可记录任何Java应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。下面我们来看一下怎么在项目中使用P6Spy。

引入Maven依赖

首先我们在项目中引入P6Spy的相关依赖。
        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>2.3.1</version>
        </dependency>

新增spy.properties

接下来我们需要在项目的classpath目录下增加spy.properties文件。其实这个文件P6Spy为我们提供了,但是我们可能还需要修改其中的一些东西。我现在配置的内容如下所示:
module.log=com.p6spy.engine.logging.P6LogFactory
driverlist=com.mysql.jdbc.Driver
deregisterdrivers=true
outagedetection=false
filter=false
autoflush = true
excludecategories=info,debug,result,batch
append=true
appender=com.p6spy.engine.spy.appender.Slf4JLogger
log4j.logger.p6spy=INFO,STDOUT,F
#配置p6spy的日志不重复打印
log4j.additivity.p6spy=false
logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
因为我的项目中配置了log4j.properties,所以这里我没有怎么配置日志输出相关的东西(日志相关的配置项在原来)。

替换原来的数据库驱动

接着我们需要做的是替换原来的数据库驱动。我的数据库用的是MySQL所以我这里做的修改是这样的(其他的数据库照样画葫芦)。
原来的数据库驱动:
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
修改之后的驱动:
<property name="driverClassName" value="com.p6spy.engine.spy.P6SpyDriver"/>
原来的URL:
<property name="url" value="jdbc:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8"></property>
修改之后的URL:
<property name="url"  value="jdbc:p6spy:mysql://localhost:3306/XXX?useUnicode=true&characterEncoding=UTF-8"></property>
OK,经过这三步,我们的P6Spy就可以在项目中生效了。最后我们看一下效果:

效果

我在页面上进行了一个提交的操作,这个操作会向数据库中插入一条数据。我们看一下P6Spy跟踪到的sql语句:
控制台:

日志文件中:


P6Spy跟踪到了真正执行的sql语句。
附:
我的log4j.properties的内容
#Console Log
log4j.rootLogger=info, console, file

# Write to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n

#Write to File
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=D:/log/provider.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n
P6Spy的一些配置说明:
#MODULE p6spy提供了两种模块进行日志记录:log和outage,两者有不同的功能,配置参数也有专属,但是它们也共享一些配置参数,如哪些表被记录,日志文件名称和地址,是否显示sql执行轨迹等。 
#log用来拦截和记录任何使用jdbc的应用的数据库声明日志,默认为开启。  
#outage主要是用来最低化log所带来的性能问题,只记录超过一定时间的执行语句,默认为关闭。   
module.log=com.p6spy.engine.logging.P6LogFactory    
#module.outage=com.p6spy.engine.outage.P6OutageFactory  
#实际的数据库驱动,真正的数据库驱动  
realdriver=com.mysql.jdbc.Driver  
#实际的数据库驱动备份,当前面的数据库驱动不对时,顺序查找下一驱动,直到找到合适为止,默认为空。   
realdriver2=   
realdriver3=  
#无效化已注册的驱动,如果在其他地方已经定义好了真正的数据库驱动,那么p6spy driver就不会生效,也就不能起到作用,所以需#要把此选项置为true。    
deregisterdrivers=true  
#log模块专属的参数,当log模块开启时,如果执行语句超出这个时间(单位为毫秒),才能被记录在文件中,可以重新被载入,默认为0。    
executionthreshold=   
#outage专属的参数,当outage模块开启时,outagedetection为true时,会根据outagedetectioninterval(单位为秒)的大小, 间隔的去捕获执行语句,一般用来捕获长时间执行的语句。。    
outagedetection=false 
outagedetectioninterval=  
#以下参数是公共的属性,log和outage都可以公用的参数过滤器开关,是否根据参数过滤一些记录内容  
filter=false  
#当过滤器开启时,需要记录的表,默认为都记录    
include=  
#当过滤器开启时,不需要记录的表,默认为都记录    
exclude=  
#当过滤器开启时,根据sql表达式过滤    
sqlexpression =  
#是否自动刷新    
autoflush   = true  
#输出的日志文件的日期格式,也就是用Java的SimpleDateFormat程序。    
dateformat=  
#定义包含的日志级别,当日志级别属于此类型时,才能被记录,属性值有error, info, batch, debug, statement, commit, rollback 和result   
includecategories=  
#定义不包含的日志级别,当日志级别属于此类型时,不会被记录    
excludecategories=  
#使用正则表达式来过滤 Log,匹配时才会被记录,例如: #stringmatcher=com.p6spy.engine.common.GnuRegexMatcher #stringmatcher=com.p6spy.engine.common.JakartaRegexMatcher    
stringmatcher=  
#是否对每一SQL的执行语句进行打印堆栈跟踪信息,通常在进行长时间执行SQL的情况下打开进行监控。
stacktrace=false  
#当上一轨迹开关打开时,可以指定具体的类名来进行过滤。    
stacktraceclass =   
#监测属性配置文件是否进行重新加载,一般应用服务器在启动时进行加载一次就够了。    
reloadproperties=false  
#当是否重新加载开关打开时,定义重新加载时间周期。    
reloadpropertiesinterval = 60   
#是否加上前缀,设置为 true,会加上 p6spy: 作为前缀    
useprefix=false  
#指定 Log 的 appender,与 Log4J 有点同义,取值:com.p6spy.engine.logging.appender.Log4jLogger com.p6spy.engine.logging.appender.StdoutLogger com.p6spy.engine.logging.appender.FileLogger   
appender=com.p6spy.engine.logging.appender.FileLogger  
#指定记录的日志文件名称和地址,根目录在应用服务器的发布端.如tomcat在%TOMCAT_HOME%/bin目录下。    
logfile = log/spy11.log  
#文件续载标识,在log的appender类型为FileLogger时,才生效,如果为true,则在生成的日志文件后面继续进行记录,否则删除之前的内容。    
append=true  
#类似与log4j的记录器的布局:
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender 
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout 
log4j.appender.STDOUT.layout.ConversionPattern=p6spy - #%m%n

另外还有和P6spy一起使用的图形界面的sql性能分析工具。具体的看这篇文章:监控和剖析数据库操作 -- P6Spy、SQL Profiler、IronTrack SQL 使用简介( https://www.ibm.com/developerworks/cn/java/j-lo-p6spy/











相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 安全 数据库
win10 安装 sql server2012
安装 SQL Server 2012 是许多开发者使用数据库的第一步。主要步骤包括:下载并运行安装程序,接受许可条款,选择功能(如数据库引擎服务),配置实例和服务器设置,设置身份验证模式,完成安装并进行测试。建议安装 SQL Server Management Studio (SSMS) 进行管理和维护,确保数据安全。
77 3
|
1月前
|
SQL Java
|
3月前
|
SQL 大数据 数据处理
Flink SQL 详解:流批一体处理的强大工具
Flink SQL 是为应对传统数据处理框架中流批分离的问题而诞生的,它融合了SQL的简洁性和Flink的强大流批处理能力,降低了大数据处理门槛。其核心工作原理包括生成逻辑执行计划、查询优化和构建算子树,确保高效执行。Flink SQL 支持过滤、投影、聚合、连接和窗口等常用算子,实现了流批一体处理,极大提高了开发效率和代码复用性。通过统一的API和语法,Flink SQL 能够灵活应对实时和离线数据分析场景,为企业提供强大的数据处理能力。
460 26
|
5月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
255 4
|
5月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
246 1
|
5月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
184 1
|
6月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
166 11
|
6月前
|
SQL 数据可视化 安全
微软SQL Server可视化工具与技巧
微软SQL Server不仅提供了强大的数据库管理功能,还集成了多种可视化工具,帮助用户更直观地理解和管理数据
|
6月前
|
SQL 安全 网络安全
SQL安装程序规则错误解决方案
在安装SQL Server时,遇到安装程序规则错误是一个比较常见的问题
|
6月前
|
SQL 网络安全 数据库
机房电脑下载并安装SQL Server的详细步骤
在机房电脑上下载并安装SQL Server是一个常见的任务,特别是对于学习数据库管理或进行相关项目开发的学生和开发者来说

热门文章

最新文章

下一篇
oss创建bucket