侧边栏壁纸
  • 累计撰写 49 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

P6Spy SQL 监控:性能分析与优化

阿砖
2024-07-01 / 0 评论 / 0 点赞 / 191 阅读 / 5262 字

P6Spy 是一个框架,它使数据库数据能够无缝地被拦截和记录,而无需对现有应用进程进行代码更改。但是这个框架并不适合在生产中使用,只适合在测试环境用来统计 sql 数据。不过在监控方面 Mybatis Plus 也推荐了这个框架作为监控 SQL 使用。

本文章也是基于 SpringBoot 2.6.x 、Mybatis Plus、p6spy 来实现简单的 sql 日志展示。首先通过 https://start.aliyun.com/ 构建一个SpringBoot 基础 web 项目然后添加 Mybatis Plus 和 p6spy 相关 POM坐标

	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<spring-boot.version>2.6.13</spring-boot.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.7</version>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.github.gavlyukovskiy</groupId>
			<artifactId>p6spy-spring-boot-starter</artifactId>
			<version>1.9.1</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

将项目中 application.properties 替换为 application.yml 。

server:
  port: 9803
  
spring:
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    username: root
    password: 123qwe.
    url: jdbc:p6spy:mysql://localhost:23306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
#
decorator:
  datasource:
    p6spy:
      logging: custom
      log-format: executionTime:%(exectionTime) | sql:%(sqlSingleLine)

需要注意的是 driver-class-name 必须是 com.p6spy.engine.spy.P6SpyDriver 才可以,并且要在数据库链接加上 p6spy 标签才可以 jdbc:p6spy:mysql://... 下面的 decorator 配置是 p6spy 需要的配置直接抄就行了,如果需要增改配置自行查下手册。 在数据库中创建一个 test 库并执行下面的sql语句,随便添加几条数据就好。

CREATE TABLE `goods` (
  `id` varchar(255) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

因为要对接 Mybatis Plus 所以要让 p6spy 对接上才行,在项目的 resources 目录中添加一个 spy.properties 并粘贴下面的内容

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

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

useprefix=true

spy 配置文件中的 logMessageFormat 是日志的格式化配置,如果打开 P6SpyLogger.class 可以看到下面的内容

/**
 * P6spy SQL 打印策略
 *
 * @author hubin
 * @since 2019-02-20
 */
public class P6SpyLogger implements MessageFormattingStrategy {

    @Override
    public String formatMessage(int connectionId, String now, long elapsed, String category,
                                String prepared, String sql, String url) {
        return StringUtils.isNotBlank(sql) ? " Consume Time:" + elapsed + " ms " + now +
            "\n Execute SQL:" + sql.replaceAll("[\\s]+", " ") + "\n" : "";
    }
}

这个就是简单的打印信息,如果想要自定义可以自行实现这个策略。我这里为了演示,所以直接使用 MybatisPlus 自己的了。 剩下的内容就是创建 MapperControllerDTO 之类的了这里不在描述,自行实现即可。最后通过访问 Controller 获得的结果为。

 Consume Time:2155 ms 1719802248036
 Execute SQL:SELECT COUNT(*) AS total FROM goods

 Consume Time:3 ms 1719802248059
 Execute SQL:SELECT id,title,price,content FROM goods LIMIT 10

注:

[1] Mybatis Plus 日志:https://github.com/baomidou/mybatis-plus/releases?page=2

[2] p6spy 项目地址:https://github.com/p6spy/p6spy

0

评论区