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不识别问题,其余的数据源都很好集成,如果遇到其余的稀奇古怪的问题,请先排查框架本身是否正常。

相关推荐
许苑向上5 分钟前
Dubbo集成SpringBoot实现远程服务调用
spring boot·后端·dubbo
郑祎亦1 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
捂月3 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
FIN技术铺6 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小码的头发丝、6 小时前
Spring Boot 注解
java·spring boot
午觉千万别睡过6 小时前
RuoYI分页不准确问题解决
spring boot
2301_811274316 小时前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
编程重生之路7 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端