【工具使用】【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 小结
好啦,本节暂时就看到这里,有理解不对的地方欢迎指正。