【SpringBoot应用篇】SpringBoot集成P6Spy记录SQL日志

本文介绍了如何在SpringBoot项目中集成P6Spy来记录和分析SQL日志。P6Spy是一个用于拦截和修改SQL语句的开源框架,能够帮助开发者直观地查看执行的SQL。文章详细展示了从添加依赖、配置application.yml到自定义日志格式的过程,并提供了Oracle数据库的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P6Spy简介

P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。

通过P6Spy可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。

我们最需要的功能,查看sql语句,不是预编译的带问号的哦,而是真正的数据库执行的sql,更直观,更简单。

应用场景

pom

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.8.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
    </dependencies>

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    #driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
    # url: jdbc:p6spy:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
    username: root
    password: root

# 打开mybatis-plus的sql日志输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

entity

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("course_1")
public class Course {
    @TableField("cid")
    private Long cId;
    private String cName;
    private Integer userId;
    private String cStatus;
}

Mapper

public interface CourseMapper extends BaseMapper<Course> {
}

启动类

@SpringBootApplication
@MapperScan(basePackages = "cn.zysheep.mapper")
public class ShardingjdbcdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShardingjdbcdemoApplication.class, args);
    }
}

测试类

@SpringBootTest
@Slf4j
class ShardingjdbcdemoApplicationTests {

    @Autowired
    private CourseMapper courseMapper;
    
    @SneakyThrows
    @Test
    void findCourse() {
        courseMapper.selectList(null).forEach(System.out::println);
    }
}

mybatis-plus也可以打印输出的sql日志,但是不是我们想要的效果,如何来控制想要的sql日志输出,可以使用P6Spy开源产品。
在这里插入图片描述

P6Spy入门使用

spy.properties

resources目录添加配置文件,类似log4j.xml,记录配置信息

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# sql日志打印输出
# 1、logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
# 2、logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
# customLogMessageFormat=%(currentTime) | SQL use time: %(executionTime) ms | connect info: %(category)-%(connectionId) | execute sql: %(sql)
# 3、自定义日志打印(全限定类名)
logMessageFormat=cn.zysheep.config.P6SPYConfig
# 使用日志系统记录sql
appender=com.p6spy.engine.spy.appender.Slf4JLogger
## 配置记录Log例外
excludecategories=info,debug,result,batc,resultset
# 设置使用p6spy driver来做代理
deregisterdrivers=true
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动
driverlist=com.mysql.cj.jdbc.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 秒
outagedetectioninterval=2

P6Spy有内置的SQL输出格式,如上配置文件。这里我们使用自定义SQL日志打印

P6SPYConfig

public class P6SPYConfig  implements MessageFormattingStrategy {
    
    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");

    /**
     * 自定义sql日志打印
     *
     * @param connectionId 连接标识
     * @param now          执行时间
     * @param elapsed      执行秒数ms
     * @param category     statement
     * @param prepared     预编译sql语句
     * @param sql          真实的sql语句
     * @param url          数据库url连接
     * @return {@link String}
     */
    @Override
    public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
        Map<String, Object> message = new LinkedHashMap<>(4);
        if (StringUtils.isNoneBlank(prepared, sql) ) {
            message.put("SQL execute time:", this.format.format(new Date()));
            message.put("SQL explain time:", elapsed + "ms");
            String newPrepared = prepared.replace("   ", "").replace("\n", " ");
            message.put("SQL prepared:", newPrepared);
            String newSql = sql.replace("   ", "").replace("\n", " ");
            message.put("SQL real:", newSql);
        }
        return JSONObject.toJSONString(message.isEmpty() ? "" : message, true);
    }
}

application.yml

spring:
  datasource:
    # driver-class-name: com.mysql.cj.jdbc.Driver
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    type: com.alibaba.druid.pool.DruidDataSource
    #  url: jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
    url: jdbc:p6spy:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
    username: root
    password: root

# 打开mybatis-plus的sql日志输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

测试类不变
在这里插入图片描述

Oracle使用

1、spy.properties修改

# 实际驱动
driverlist=oracle.jdbc.driver.OracleDriver

2、application.yml修改

jdbc.driverClassName=com.p6spy.engine.spy.P6SpyDriver
jdbc.url=jdbc:p6spy:oracle:thin:@27.0.0.1:1521:orcl
<think>嗯,我现在需要了解一下如何在Spring Boot集成p6spy来连接达梦数据库。首先,我得确定p6spy是什么,以及它和达梦数据库的关系。p6spy应该是一个数据库监控工具,可以记录SQL日志,方便调试,对吧?而达梦是国产的关系型数据库,可能和MySQL或PostgreSQL类似,但有自己的JDBC驱动。 首先,我应该考虑Spring Boot项目的基本结构,比如Maven或Gradle的依赖管理。集成p6spy通常需要添加相关的依赖,然后配置数据源,对吧?但是达梦的JDBC驱动可能需要特定的配置,比如驱动类名和连接URL。 接下来,p6spy的配置可能需要替换原有的数据源,或者通过中间层来拦截SQL语句。记得p6spy需要一个spy.properties配置文件,里面可以设置实际使用的驱动类,比如达梦的驱动类可能是dm.jdbc.driver.DmDriver,而p6spy的驱动类是com.p6spy.engine.spy.P6SpyDriver。这时候,数据库连接URL应该以jdbc:p6spy:开头,后面跟着实际的达梦URL。 然后,用户可能需要在Spring Boot的application.yml或application.properties中配置数据源,将驱动类设置为p6spy的驱动,URL按照p6spy的格式来写。同时,可能需要排除默认的数据源自动配置,或者自定义数据源,特别是如果使用Druid等连接池的话,需要额外处理。 另外,可能还需要处理依赖冲突,比如p6spy和达梦驱动的版本是否兼容。需要确认两者的兼容性,可能需要调整版本号。还有日志输出的配置,p6spy默认的日志输出可能不够详细,需要调整spy.properties中的配置,比如设置logMessageFormat为com.p6spy.engine.spy.appender.CustomLineFormat,或者自定义格式,以便更好地查看SQL语句和执行时间。 可能遇到的错误包括驱动类找不到,这时候要检查依赖是否正确引入;或者连接URL格式错误,导致无法正确解析到达梦数据库;还有可能日志没有输出,需要检查配置文件的位置是否正确,是否被正确加载。 测试的时候,可能需要编写一个简单的查询,比如通过JdbcTemplate执行SELECT 1,然后查看控制台是否有p6spy输出的SQL日志,包括执行时间和参数等信息。如果能看到这些日志,说明集成成功。 总结步骤应该是:添加p6spy和达梦驱动的依赖;配置数据源使用p6spy驱动;调整spy.properties文件;处理可能的依赖和配置问题;测试验证。需要注意不同版本的兼容性,以及配置文件的位置是否正确,比如spy.properties是否放在resources目录下。另外,如果使用Spring Boot 2.x或更高版本,可能需要注意自动配置的排除或自定义数据源的方式。</think>以下是SpringBoot集成p6spy连接达梦数据库的详细步骤: --- ### 一、添加依赖 在`pom.xml`中添加以下依赖: ```xml <!-- 达梦数据库驱动 --> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver</artifactId> <version>8.1.1.193</version> <!-- 根据实际版本调整 --> </dependency> <!-- p6spy --> <dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.9.0</version> </dependency> ``` --- ### 二、配置数据源 在`application.yml`中配置: ```yaml spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver # 使用p6spy驱动 url: jdbc:p6spy:dm://IP:PORT/DATABASE?schema=SCHEMA_NAME username: your_username password: your_password ``` > **注意**:达梦原生URL格式为`jdbc:dm://IP:PORT/DATABASE`,通过`jdbc:p6spy:`前缀包装。 --- ### 三、配置p6spy参数 在`src/main/resources`下创建`spy.properties`: ```properties # 真实驱动类(达梦) driverlist=dm.jdbc.driver.DmDriver # 日志输出格式(可选) logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat # 自定义日志格式 customLogMessageFormat=%(executionTime) ms | SQL: %(sqlSingleLine) ``` --- ### 四、排除原生驱动冲突(可选) 若出现驱动冲突,在SpringBoot启动类添加: ```java @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) ``` --- ### 五、验证集成 1. 执行一个SQL查询(如通过JdbcTemplate) 2. 观察控制台输出,正常情况会显示: ``` 2023-xx-xx 12:00:00 | INFO | 5 ms | SQL: SELECT * FROM user WHERE id=1 ``` --- ### 常见问题解决 1. **驱动类未找到** - 检查达梦驱动版本是否匹配 - 确认依赖已正确下载(查看本地Maven仓库) 2. **连接URL错误** - 确保URL前缀为`jdbc:p6spy:dm://` - 核对达梦数据库IP、端口、库名 3. **SQL日志未输出** - 检查`spy.properties`是否在`resources`根目录 - 尝试调整日志级别:`logging.level.com.p6spy=DEBUG` --- ### 六、高级配置(可选) 1. **过滤敏感SQL** 在`spy.properties`中添加: ```properties # 排除监控的SQL类型 exclude=COMMIT,ROLLBACK ``` 2. **性能监控** 启用执行时间阈值告警: ```properties executionThreshold=100 # 超过100ms的SQL记录为WARN ``` --- 通过以上步骤即可实现SpringBoot通过p6spy监控达梦数据库的SQL操作。实际部署时建议根据生产环境调整日志格式和输出级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李少谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值