SpringBoot项目集成阿里Druid连接池
阿里的开源Druid,GitHub上有相关介绍,链接地址如下:
- Druid源码地址:https://github.com/alibaba/druid
- 中文文档:https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
- 英文文档:https://github.com/alibaba/druid/wiki/FAQ
- SpringBoot集成Druid:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
1. POM中引入依赖
Maven
1 | <dependency> |
Gradle
1 | compile 'com.alibaba:druid-spring-boot-starter:1.1.10' |
2. 配置属性
application.yml中druid配置属性如下:(application.properties中配置类似)
1 | spring: |
各个配置属性说明在阿里的Druid GitHub上有介绍,地址:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
各个配置属性参考值,地址:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AESQL合并,慢SQL记录,多个DruidDataSource的监控数据合并配置,地址:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
关于一些配置的说明:
可能有人对PSCache这两项配置存在疑问?
1
2
3
4# 开启缓存preparedStatement(PSCache)
pool-prepared-statements: true
# 启用PSCache后,指定每个连接上PSCache的大小
max-pool-prepared-statement-per-connection-size: 20Druid官方建议对于MySQL数据库,关闭preparedStatement缓存(即PSCache),即pool-prepared-statements配置为false。原因是:PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。
InfoQ上有一篇文章对其MySQL是否要开启PSCache做了介绍,地址:https://www.infoq.cn/article/2017%2F03%2FAnalysis-errors-MySQL-JDBC
关于url和driver-class-name配置项的说明。
1
2url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver先说驱动类driver-class-name配置项,为什么配置值是
com.mysql.cj.jdbc.Driver,而不是com.mysql.jdbc.Driver?原因是: 从mysql6开始,驱动包开始使用新的驱动,即
com.mysql.cj.jdbc.Driver。如果使用的mysql为6.0之后的版本,但使用的是旧的5.0版本的驱动包,则驱动配置为com.mysql.jdbc.Driver,不过这种使用旧的5.0驱动包可能会出现一些意想不到的问题,所以还是建议将驱动包升级,然后改变驱动的值。解决方法:
<1> 先查一下自己的mysql版本。
在mysql中执行:select VERSION();

查询mysql版本
相关文章介绍链接地址:https://blog.csdn.net/lamp_yang_3533/article/details/52266320
<2> 若mysql版本高于5.0,则将驱动类driver-class-name配置为:
com.mysql.cj.jdbc.Driver相关异常信息:
Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.再说url配置项,主要是
serverTimezone=GMT%2B8时区由于mysql版本升级后,新版数据库和系统之间有了时区差异,需要指定时区
serverTimezone=GMT%2B8(北京时间东八区),UTC代表是全球标准时间,北京时间东八区领先UTC 8个小时。如果配置
serverTimezone=UTC(全球标准时间),连接不报错,但实际数据库中显示的时间比我们插入时的时间晚8小时。1
2
3
4
5
6# 北京时间东八区
serverTimezone=GMT%2B8
# 上海时间
serverTimezone=Asia/Shanghai
# 重庆时间
serverTimezone=Asia/Chongqing可以参考以下文章介绍:
JDBC连接Mysql数据库出现的问题汇总:https://www.jianshu.com/p/bbc76bc5b7cd
mysql时区错误及解决办法: https://www.jianshu.com/p/0d53218da27d
为何没有asia/beijing时区?:https://www.cnblogs.com/softidea/p/6939925.html
到此SpringBoot项目集成阿里Druid连接池完成了,启动SpringBoot应用程序,打开浏览器,输入:http://127.0.0.1:8080/druid/index.html, 即可看到下面的Druid Monitor监控界面:
SpringBoot集成阿里Druid连接池
3. 实践拓展
抛出问题1:在实际企业级应用中,数据库密码是敏感信息,SpringBoot集成Druid对数据库密码是怎么加密呢?
进入druid-1.1.10.jar所在文件夹,打开命令行,执行如下命令:
1 | java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools 123456 |
输出
1 | privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAljkI+2y1h27So4a0+OyZGp093q0VrMZKKgZHCX1X3VHdG914tZsQIpm4SJ9gAQDCeRh5ZcxOI2v2inD+0AQN0QIDAQABAkAmkXom4yAwJ1nZNiqchlJArQJHe3THKRm9dGMkopO+dHN2lKqP1X4FUS7/sPf08uQ+ijH063St+YrNk6qj3nUpAiEAxfGjUG2ZbIYjKqAx9NhGFi1s4xwzp0kK6hUkvRhpKI8CIQDCSFHQVWT2PopjaLWaDTVYUebLZlSOuz8rU6LayFrTnwIhALCIYG5KUJpIxvQtCmCiwV7mBEZH0IlQyzsYwDskmiRhAiBv4Q2cF1DorOMsk+PgLrMFhUSO5QLUnueln6gsrSwAqQIgH0jlqWKuwuuTwZSM4P/HS4YaacrLL70Fe101YF4fjCs= |
application.yml中druid配置属性更改后如下:(application.properties中配置类似)
1 | spring: |
配置变更说明:
首先把密码改为加密后的密码
1
password: O50UxdSUY9ZGfafYEh9/ovo5Lb8b/FaGlOaZstW+UqMrrz+fanCSALo9OJHrpykY2fyrKdcjp5aE57dzhFRMPQ==
filters配置值中增加config
1
filters: config,stat,log4j,wall
说明:Druid对数据库密码加密和解密用的都是com.alibaba.druid.filter.config.ConfigFilter这个类,所以在数据源配置项filters上必须添加上config值,否则始终会抛出数据库连接异常。
增加connection-properties连接属性配置项
1
2
3
4
5
6connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJY5CPtstYdu0qOGtPjsmRqdPd6tFazGSioGRwl9V91R3RvdeLWbECKZuEifYAEAwnkYeWXMTiNr9opw/tAEDdECAwEAAQ==
说明:
connection-properties配置值可配置多个,用“;”分隔
config.decrypt=true 表示解密使能
config.decrypt.key=${publickey} 解密使用上面得到的publicKey公钥
阿里的Druid GitHub上有对数据库密码加密的介绍,地址:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter


