【工具使用】【SpringBoot】【P6spy】P6spy 的使用

1  前言

今儿在看 HikariCP数据库连接池实战我主要是想看下,连接的管理、连接的获取及释放。但是看到第五章的时候,书中提到 P6spy,说是能很容易监控到 JDBC 中执行的 SQL语句。那我们平时 SpringBoot 微服务对数据的操作,不管是 JDBCTemplate、还是 Mybatis、Hibernate 最后的落点其实就是 JDBC,我们本节就来试试 SpringBoot 下 P6spy 记录 SQL。 

2  实践

我们直接按书上的步骤操作下:

2.1  配置改变

(1)引入依赖

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.8.2</version>
</dependency>

(2)修改数据源信息

# 驱动由原来的
spring.datasource.driver-class-name = org.postgresql.Driver
# 变成
spring.datasource.driver-class-name = com.p6spy.engine.spy.P6SpyDriver

# JDBCURL 由原来的
spring.datasource.url = jdbc:postgresql://localhost:5432/test
# 变成(加上p6spy)
spring.datasource.url = jdbc:p6spy:postgresql://localhost:5432/test

(3)添加 spy.properties

driverlist=org.postgresql.Driver
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.virtuous.demo.laboratory.p6spy.P6spyTest

自定义打印格式:

/**
 * @author: kuku
 * @description
 */
public class P6spyTest implements MessageFormattingStrategy {

    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");

    /**
     * 自定义sql日志打印
     *
     * @param connectionId 连接标识
     * @param now          当前时间
     * @param elapsed      执行耗时ms(需要注意的是这里的耗时指的是从发送sql到服务器截止到收到服务器响应结果的总耗时,而不是sql本身在服务器的执行时间)
     * @param category     statement 操作的类型,比如查询,更新,commit,rollback等
     * @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("开始时间:", format.format(new Date(Long.parseLong(now))));
            message.put("执行耗时:", String.format("%sms", elapsed));
            String newPrepared = prepared.replace("   ", "").replace("\n", " ");
            message.put("预编译SQL语句:", newPrepared);
            String newSql = sql.replace("   ", "").replace("\n", " ");
            message.put("真实执行SQL语句:", newSql);
            return JSONObject.toJSONString(message, true);
        }
        return null;
    }
}

2.2  执行效果

3  小结

好啦,本节暂时就看到这里,有理解不对的地方欢迎指正。

posted @ 2024-08-20 16:43  酷酷-  阅读(584)  评论(0编辑  收藏  举报