Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

项目开发阶段,mybatis的SQL打印有占位符,调试起来还是有点麻烦,随想整合P6Spy打印可以直接执行的SQL,方便调试,用的Durid连接池。

Springboot项目集成Durid

XML 复制代码
<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>druid-spring-boot-starter</artifactId>

    <version>1.2.18</version>

</dependency>

配置文件application.yml

java 复制代码
spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=true

    username: root

    password: 123456

    # 指定数据源为 DruidDataSource,默认值为 HikariDataSource

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      initial-size: 5

      min-idle: 5

      max-active: 15

      max-wait: 30000

      min-evictable-idle-time-millis: 30000

      time-between-eviction-runs-millis: 30000

      validation-query: SELECT 1 FROM DUAL

      test-while-idle: true

      test-on-borrow: false

      test-on-return: false

      pool-prepared-statements: true

      max-pool-prepared-statement-per-connection-size: 5

      filters: stat,wall

      use-global-data-source-stat: true

      stat-view-servlet:

        enabled: true

        url-pattern: /druid/*

        login-username: admin

        login-password: 111111

      web-stat-filter:

        enabled: true

        url-pattern: /*

        exclusions: /druid/*, *.js, *.jpeg, *.jpg, *.png, *.gif, *.css

      filter:

        stat:

          merge-sql: true

          slow-sql-millis: 3000

          log-slow-sql: true

配置P6Spy,有两种方式,一种是添加依赖jar包,一种是用p6spy-spring-boot-starter。

第一种:

添加依赖:可以添加到dev环境,生产环境不建议使用,有性能损耗。

XML 复制代码
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

或者只添加到开发环境

XML 复制代码
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <profiles.active>dev</profiles.active>
        </properties>
        <dependencies>
            <dependency>
                <groupId>p6spy</groupId>
                <artifactId>p6spy</artifactId>
                <version>3.9.1</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

修改数据源配置,需要改2个地方,url和driver-class-name

修改前:

修改后:

XML 复制代码
spring:
  datasource:
    url: jdbc:p6spy:mysql://x.x.x.x:3306/my_test?allowPublicKeyRetrieval=true&useSSL=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver

添加spy.properties文件,默认会在项目根目录生成一个spy.log文件,把SQL打印到该文件中。

XML 复制代码
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定义日志打印

logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

#日志输出到控制台

appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

# 使用日志系统记录 sql

#appender=com.p6spy.engine.spy.appender.Slf4JLogger

# 设置 p6spy driver 代理

deregisterdrivers=true

# 取消JDBC URL前缀

useprefix=true

# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.

excludecategories=info,debug,result,batch,resultset

# 日期格式

dateformat=yyyy-MM-dd HH:mm:ss

# 真实JDBC driver , 多个以 逗号 分割 默认为空

#driverlist=org.h2.Driver

driverlist=oracle.jdbc.OracleDriver

# 是否开启慢SQL记录

outagedetection=true

# 慢SQL记录标准 2 秒

outagedetectioninterval=2

集成完成。

spy.properties参考:

mybatis-plus:

XML 复制代码
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

官网的例子:

XML 复制代码
#################################################################

# P6Spy Options File                                            #

# See documentation for detailed instructions                   #

# http://p6spy.github.io/p6spy/2.0/configandusage.html          #

#################################################################



#################################################################

# MODULES                                                       #

#                                                               #

# Module list adapts the modular functionality of P6Spy.        #

# Only modules listed are active.                               #

# (default is com.p6spy.engine.logging.P6LogFactory and         #

# com.p6spy.engine.spy.P6SpyFactory)                            #

# Please note that the core module (P6SpyFactory) can't be      #

# deactivated.                                                  #

# Unlike the other properties, activation of the changes on     #

# this one requires reload.                                     #

#################################################################

#modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory



################################################################

# CORE (P6SPY) PROPERTIES                                      #

################################################################



# A comma separated list of JDBC drivers to load and register.

# (default is empty)

#

# Note: This is normally only needed when using P6Spy in an

# application server environment with a JNDI data source or when

# using a JDBC driver that does not implement the JDBC 4.0 API

# (specifically automatic registration).

#driverlist=



# for flushing per statement

# (default is false)

#autoflush=false



# sets the date format using Java's SimpleDateFormat routine.

# In case property is not set, milliseconds since 1.1.1970 (unix time) is used (default is empty)

#dateformat=



# prints a stack trace for every statement logged

#stacktrace=false

# if stacktrace=true, specifies the stack trace to print

#stacktraceclass=



# determines if property file should be reloaded

# Please note: reload means forgetting all the previously set

# settings (even those set during runtime - via JMX)

# and starting with the clean table

# (default is false)

#reloadproperties=false



# determines how often should be reloaded in seconds

# (default is 60)

#reloadpropertiesinterval=60



# specifies the appender to use for logging

# Please note: reload means forgetting all the previously set

# settings (even those set during runtime - via JMX)

# and starting with the clean table

# (only the properties read from the configuration file)

# (default is com.p6spy.engine.spy.appender.FileLogger)

#appender=com.p6spy.engine.spy.appender.Slf4JLogger

#appender=com.p6spy.engine.spy.appender.StdoutLogger

#appender=com.p6spy.engine.spy.appender.FileLogger



# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log)

# (used for com.p6spy.engine.spy.appender.FileLogger only)

# (default is spy.log)

#logfile=spy.log



# append to the p6spy log file. if this is set to false the

# log file is truncated every time. (file logger only)

# (default is true)

#append=true



# class to use for formatting log messages (default is: com.p6spy.engine.spy.appender.SingleLineFormat)

#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat



# Custom log message format used ONLY IF logMessageFormat is set to com.p6spy.engine.spy.appender.CustomLineFormat

# default is %(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)

# Available placeholders are:

#   %(connectionId)            the id of the connection

#   %(currentTime)             the current time expressing in milliseconds

#   %(executionTime)           the time in milliseconds that the operation took to complete

#   %(category)                the category of the operation

#   %(effectiveSql)            the SQL statement as submitted to the driver

#   %(effectiveSqlSingleLine)  the SQL statement as submitted to the driver, with all new lines removed

#   %(sql)                     the SQL statement with all bind variables replaced with actual values

#   %(sqlSingleLine)           the SQL statement with all bind variables replaced with actual values, with all new lines removed

#customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)



# format that is used for logging of the java.util.Date implementations (has to be compatible with java.text.SimpleDateFormat)

# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ)

#databaseDialectDateFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ



# format that is used for logging of the java.sql.Timestamp implementations (has to be compatible with java.text.SimpleDateFormat)

# (default is yyyy-MM-dd'T'HH:mm:ss.SSSZ)

#databaseDialectTimestampFormat=yyyy-MM-dd'T'HH:mm:ss.SSSZ



# format that is used for logging booleans, possible values: boolean, numeric

# (default is boolean)

#databaseDialectBooleanFormat=boolean



# Specifies the format for logging binary data. Not applicable if excludebinary is true.

# (default is com.p6spy.engine.logging.format.HexEncodedBinaryFormat)

#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.PostgreSQLBinaryFormat

#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.MySQLBinaryFormat

#databaseDialectBinaryFormat=com.p6spy.engine.logging.format.HexEncodedBinaryFormat



# whether to expose options via JMX or not

# (default is true)

#jmx=true



# if exposing options via jmx (see option: jmx), what should be the prefix used?

# jmx naming pattern constructed is: com.p6spy(.<jmxPrefix>)?:name=<optionsClassName>

# please note, if there is already such a name in use it would be unregistered first (the last registered wins)

# (default is none)

#jmxPrefix=



# if set to true, the execution time will be measured in nanoseconds as opposed to milliseconds

# (default is false)

#useNanoTime=false



#################################################################

# DataSource replacement                                        #

#                                                               #

# Replace the real DataSource class in your application server  #

# configuration with the name com.p6spy.engine.spy.P6DataSource #

# (that provides also connection pooling and xa support).       #

# then add the JNDI name and class name of the real             #

# DataSource here                                               #

#                                                               #

# Values set in this item cannot be reloaded using the          #

# reloadproperties variable. Once it is loaded, it remains      #

# in memory until the application is restarted.                 #

#                                                               #

#################################################################

#realdatasource=/RealMySqlDS

#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource



#################################################################

# DataSource properties                                         #

#                                                               #

# If you are using the DataSource support to intercept calls    #

# to a DataSource that requires properties for proper setup,    #

# define those properties here. Use name value pairs, separate  #

# the name and value with a semicolon, and separate the         #

# pairs with commas.                                            #

#                                                               #

# The example shown here is for mysql                           #

#                                                               #

#################################################################

#realdatasourceproperties=port;3306,serverName;myhost,databaseName;jbossdb,foo;bar



#################################################################

# JNDI DataSource lookup                                        #

#                                                               #

# If you are using the DataSource support outside of an app     #

# server, you will probably need to define the JNDI Context     #

# environment.                                                  #

#                                                               #

# If the P6Spy code will be executing inside an app server then #

# do not use these properties, and the DataSource lookup will   #

# use the naming context defined by the app server.             #

#                                                               #

# The two standard elements of the naming environment are       #

# jndicontextfactory and jndicontextproviderurl. If you need    #

# additional elements, use the jndicontextcustom property.      #

# You can define multiple properties in jndicontextcustom,      #

# in name value pairs. Separate the name and value with a       #

# semicolon, and separate the pairs with commas.                #

#                                                               #

# The example shown here is for a standalone program running on #

# a machine that is also running JBoss, so the JNDI context     #

# is configured for JBoss (3.0.4).                              #

#                                                               #

# (by default all these are empty)                              #

#################################################################

#jndicontextfactory=org.jnp.interfaces.NamingContextFactory

#jndicontextproviderurl=localhost:1099

#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.naming:org.jnp.interfaces



#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory

#jndicontextproviderurl=iiop://localhost:900



################################################################

# P6 LOGGING SPECIFIC PROPERTIES                               #

################################################################



# filter what is logged

# please note this is a precondition for usage of: include/exclude/sqlexpression

# (default is false)

#filter=false



# comma separated list of strings to include

# please note that special characters escaping (used in java) has to be done for the provided regular expression

# (default is empty)

#include=

# comma separated list of strings to exclude

# (default is empty)

#exclude=



# sql expression to evaluate if using regex

# please note that special characters escaping (used in java) has to be done for the provided regular expression

# (default is empty)

#sqlexpression=



#list of categories to exclude: error, info, batch, debug, statement,

#commit, rollback, result and resultset are valid values

# (default is info,debug,result,resultset,batch)

#excludecategories=info,debug,result,resultset,batch



#whether the binary values (passed to DB or retrieved ones) should be logged with placeholder: [binary] or not.

# (default is false)

#excludebinary=false



# Execution threshold applies to the standard logging of P6Spy.

# While the standard logging logs out every statement

# regardless of its execution time, this feature puts a time

# condition on that logging. Only statements that have taken

# longer than the time specified (in milliseconds) will be

# logged. This way it is possible to see only statements that

# have exceeded some high water mark.

# This time is reloadable.

#

# executionThreshold=integer time (milliseconds)

# (default is 0)

#executionThreshold=



################################################################

# P6 OUTAGE SPECIFIC PROPERTIES                                #

################################################################

# Outage Detection

#

# This feature detects long-running statements that may be indicative of

# a database outage problem. If this feature is turned on, it will log any

# statement that surpasses the configurable time boundary during its execution.

# When this feature is enabled, no other statements are logged except the long

# running statements. The interval property is the boundary time set in seconds.

# For example, if this is set to 2, then any statement requiring at least 2

# seconds will be logged. Note that the same statement will continue to be logged

# for as long as it executes. So if the interval is set to 2, and the query takes

# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals).

#

# outagedetection=true|false

# outagedetectioninterval=integer time (seconds)

#

# (default is false)

#outagedetection=false

# (default is 60)

#outagedetectioninterval=30

第二种:

添加依赖:

XML 复制代码
<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>1.9.0</version>
</dependency>

修改数据源配置:同第一种方式,修改后

**添加配置:**这里和第一种方式不一样,可以添加个开关 enabled: true

XML 复制代码
decorator:

  datasource:

    p6spy:

      logging: file

      log-file: spy.log

      log-format: executionTime:%(executionTime) | sql:%(sqlSingleLine)

集成完成。

spy.log文件,日志格式可以通过配置文件修改,请另行参考网上的资料。

可能遇到的问题:dbType not support : null,这是没有识别出dbType,Durid数据源会存在该问题。

解决方式:修改Durid配置中的filter,在stat和wall指定dbType和enabled

总结: 除了dbType not support这个问题外,我这还遇到了connection error的问题,最后发现其实和P6Spy无关。我这不是纯净的框架,数据源配置都是jar包的方式继承的父项目,改起来很费劲。P6Spy配置其实很简单,Durid连接池用MySQL的时候会有dbType不识别问题,其余的数据源都很好集成,如果遇到其余的稀奇古怪的问题,请先排查框架本身是否正常。

相关推荐
javachen__1 分钟前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
IT毕设实战小研6 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
一只爱撸猫的程序猿7 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋7 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
武昌库里写JAVA10 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Pitayafruit11 小时前
Spring AI 进阶之路03:集成RAG构建高效知识库
spring boot·后端·llm
zru_960211 小时前
Spring Boot 单元测试:@SpyBean 使用教程
spring boot·单元测试·log4j
甄超锋12 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven
还是鼠鼠12 小时前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven
舒一笑17 小时前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端