p6spy和HikariCP的黄金搭档

前言

去年的时候,我用的还是Druid的数据源,偶然间一位大神告诉我,可以使用一下HikariCP,由于业务上没有这个需求,没有需求要对已经上线的项目的数据源进行修改,所以自己就私下玩玩,去年11月自己写了一个demostration来玩玩。
结果确实没有问题,唯一的缺憾是执行的sql语句不像Druid一样直接就打印出来了,如果放到真实的线上环境,就不好追踪sql执行过程,排查问题就很麻烦。
自己私下也尝试了很多种办法,都无果而终,放弃了一段时间,去忙了别的事情,直到今天想着赶紧解决吧,之前在查资料的时候查到了p6spy,也简单得尝试了一下,还是没有解决,于是今天又花了不少时间来解决和尝试,下面就说一下自己踩得坑。
不小心说了太多废话[汗][汗][汗][汗]

一、简单的SSM:

1、BondsController

/**
 * @author fanhf
 * @Description TODO
 * @date 2020-11-20 11:46
 */
@RestController
@RequestMapping("/bonds")
@Api(tags = "controller类")
@Slf4j
public class BondsController {
    @Autowired
    private BondsService bondsService;

    @PostMapping(value = "/bondslist")
    @ApiOperation(value = "列表展示")
    public List<BondsBean> getBondsList() {
        List<BondsBean> bondsList = bondsService.getBondsList();
        return bondsList;
    }
} 

2、BondsService:

/**
 * @author fanhf
 * @Description TODO
 * @date 2020-11-20 13:57
 */
@Service
@Slf4j
public class BondsService {
    @Autowired
    private BondsDao bondsDao;

    public List<BondsBean> getBondsList() {
        return bondsDao.getBondsList();
    }
}

3、Mapper.xml

dao接口我就不写了,再简单列一下Mapper.xml

<select id="getBondsList" resultType="com.fanhf.javastudy.mybatistest.bean.BondsBean">
        select * from t_bonds limit 10;
</select>

之所以没有全部罗列出来,一是因为这些都是基础的基础,列出来掉档次,其次,也是为了不让偷懒的你偷懒,一定要自己去写写,否则看了也白看。

上面的这些就是开胃菜了,下面就是我要说的p6spy和HikariCP的搭配的重头戏了。

二、黄金搭档闪亮登场

1、HikariCP的githup地址

https://github.com/brettwooldridge/HikariCP

HikariCP 是springboot默认的数据源,在githup上也可以看到介绍:

HikariCP It’s Faster.Hi·ka·ri [hi·ka·'lē] (Origin: Japanese): light; ray.
Fast, simple, reliable. HikariCP is a “zero-overhead” production ready JDBC connection pool. At roughly 130Kb, the library is very light. Read about how we do it here.
这段话很清晰的说到:HikariCP 快速,简单,可靠。HikariCP是“零开销”的JDBC连接池。大约130Kb,是非常轻量级的。

2、配置文件

我要我的sql执行语句呢,于是p6spy在我的千呼万唤,五彩的聚光灯下闪亮出场了。

需要两个配置文件:

2.1 application.properties
#数据库配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/new_bonds?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.url=jdbc:p6spy:mysql://127.0.0.1:3306/new_bonds?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
#spring.datasource.url=jdbc:p6spy:mysql://127.0.0.1:3306/new_bonds?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
#这两个url都可以,就是时区等参数不同
spring.datasource.username=root
spring.datasource.password=root 
##  Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
## 最小空闲连接数量
spring.datasource.hikari.minimum-idle=5
## 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
## 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=10
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
## 连接池母子
spring.datasource.hikari.pool-name=Hikari
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
## 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1


#mybatis配置
mybatis.config-location=classpath:mybatis.xml
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml
mybatis.type-aliases-package=com.fanhf.javastudy.mybatistest.*
2.2 spy.properties

我主要参考的博客是这篇:https://www.cnblogs.com/cac2020/p/11696624.html,里面的配置很详细,我这里只取一瓢饮!!!

#3.2.1以上使用
#modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory
#3.2.1以下使用或者不配置
modulelist=com.p6spy.engine.spy.P6SpyFactory,com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
#真实JDBC driver
driverlist=com.mysql.jdbc.Driver
#日志输出到控制台
#appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
appender=com.p6spy.engine.spy.appender.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger

#格式
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime) | SQL spend-time: %(executionTime) ms | connection-info: %(category)-%(connectionId) | execute-sql: %(sql)

# 设置 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=10

3、3个重要的依赖

<dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.34</version>
</dependency>
<dependency>
          <groupId>com.zaxxer</groupId>
          <artifactId>HikariCP</artifactId>
          <version>2.7.9</version>
 </dependency>
  <dependency>
           <groupId>p6spy</groupId>
           <artifactId>p6spy</artifactId>
           <version>3.7.0</version>
 </dependency>

其他的springboot 的依赖我就不赘述了,可以根据自己的demo 来配置依赖。

4、结果复现

如果连接数据源的配置不是P6SpyDriver,如下图:
在这里插入图片描述
打印的日志如下:
在这里插入图片描述
其实到这里就已经执行完了,结果已经返回给我的postman了。

将配置改成(也就是我的文字部分):
在这里插入图片描述
再次调用接口运行后日志的输出就有了喜人的sql日志了

在这里插入图片描述

5、我踩过的配置坑

5.1 url没改

在这里插入图片描述
调用接口报错:
在这里插入图片描述
看一下驱动P6SpyDriver的源码:
在这里插入图片描述

5.2 密码多了空格

在这里插入图片描述
报错信息:
在这里插入图片描述
以前没遇到过把数据库密码多个空格的问题,所以这个报错的意思大概明白,但是不知道改怎么修改,自己本地navicat是可以连上的,但就是这里报错,找了1个多小时,最后偶然发现密码错误。血的教训呀!!!

--------------你知道的越多,不知道的越多-------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值