目录
前言
去年的时候,我用的还是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个多小时,最后偶然发现密码错误。血的教训呀!!!
--------------你知道的越多,不知道的越多-------------