16.1 Druid是什么
Druid 是阿里巴巴开源的数据库连接池,除了性能比较高以外,Druid 还能能够提供强大的监控和扩展功能。所以在企业中是使用的非常多的。具体特点如下:
- 可以监控数据库访问性能, Druid 内置提供了一个功能强大的StatFilter插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有帮助。
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。 DruidDruiver 和 DruidDataSource 都支持 PasswordCallback 。
- SQL 执行日志, Druid 提供了不同的 LogFilter ,能够支持 Common-Logging 、 Log4j 和 JdkLog ,你可以按需要选择相应的 LogFilter ,监控你应用的数据库访问情况。
- 扩展 JDBC ,如果你要对 JDBC 层有编程的需求,可以通过 Druid 提供的 Filter 机制,很方便编写 JDBC 层的扩展插件。
16.2 Springboot中使用
16.2.1 方案选择
目前 Druid 官方为我们提供了两种使用依赖方式,一种是基于传统 Java 工程提供的依赖包, maven 坐标如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency
还有一种是基于 Spring Boot 提供的依赖包, maven 坐标如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
下面的这种依赖包除了包含了上面的那种 Druid 基础包,还包含了 Spring Boot 自动配置的依赖包以及 sl4j-api ,我们在 Spring Boot 中使用 Druid ,当然是推荐各位读者使用第二种方式引入依赖。
16.2.2 实现
步骤分析
1 拷贝Springboot-mybatis
2 导入druid的springboot的starter
3 进行application.yml配置
4 启动测试
16.2.2.1 拷贝Springboot-mybatis
略过
16.2.2.2 导入druid的springboot的starter
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
16.2.2.3 进行application.yml配置
server:
port: 8080 #端口
spring:
application:
name: springboot-hello # 应用名称
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql:///test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: admin
driverClassName: com.mysql.jdbc.Driver
druid:
# 连接池的配置信息
# 初始化时建立物理连接的个数
initial-size: 3
# 连接池最小连接数
min-idle: 3
# 连接池最大连接数
max-active: 20
# 获取连接时最大等待时间,单位毫秒
max-wait: 60000
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
# 既作为检测的间隔时间又作为testWhileIdel执行的依据
time-between-connect-error-millis: 60000
# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
min-evictable-idle-time-millis: 30000
# 用来检测连接是否有效的sql 必须是一个查询语句
# mysql中为 select 'x'
# oracle中为 select 1 from dual
validation-query: select 'x'
# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-borrow: false
# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-return: false
# 是否缓存preparedStatement,mysql5.5+建议开启
pool-prepared-statements: true
# 当值大于0时poolPreparedStatements会自动修改为true
max-pool-prepared-statement-per-connection-size: 20
# 合并多个DruidDataSource的监控数据
use-global-data-source-stat: false
# 配置扩展插件
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 定时输出统计信息到日志中,并每次输出日志会导致清零(reset)连接池相关的计数器。
time-between-log-stats-millis: 300000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: '/*'
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
# 配置DruidStatViewServlet
stat-view-servlet:
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
enabled: true
url-pattern: '/druid/*'
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 127.0.0.1,192.168.0.1
# IP黑名单 (存在共同时,deny优先于allow)
deny: 192.168.0.128
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: root
# 登录密码
login-password: admin
mybatis:
type-aliases-package: org.yaosang.org.domain,org.yaosang.org.query
16.2.2.4 启动测试
-
启动不报错
-
测试Service能通过
-
打开浏览器访问:http://localhost:8080/druid/ ,查看 Druid 监控页面,结果如图
16.3 Springboot中使用-数据库密码加密
在生产环境中,直接在配置文件中暴露明文密码是一件非常危险的事情,出于两点考虑:对外,即使应用服务被入侵,数据库还是安全的;对内,生产环境的数据库密码理论上应该只有 dba 知道,但是代码都是在代码仓库中放着的,如果密码没有加密,每次发布前 dba 都需要手动修改配置文件后再进行打包编译。
16.3.1 生成数据库加密密码
找到Druid.jar目录执行对数据库密码进行加密的命令。
D:\softwares\apache-maven-3.2.5\repo\com\alibaba\druid\1.1.20>java -cp druid-1.1.20.jar com.alibaba.druid.filter.config.ConfigTools admin
16.3.2 application.yml中配置
spring:
application:
name: springboot-hello # 应用名称
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql:///test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
#加密后的数据库密码
password: StZsMyc/586jXHFJpYt5qJq4kKSm4WNb5HwBlv+omQnHYNgs48VjpkEIgTsPOdsDSYEpVU9/bG5Mc3lmxQ00YQ==
driverClassName: com.mysql.jdbc.Driver
druid:
filter:
config:
enabled: true
#config.decrypt.key 拷贝publickey
connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJDWSLB1I/eX5WUhO2xYK3m199DZJVgO3hm6XXGBKjww+AYu2B+unKCMl12tPW+stl2mvJrKg4GchQXkj4zq1x0CAwEAAQ==
# 省略无数多
16.3.3. 测试
-
启动不报错
-
测试Service能通过
-
打开浏览器访问:http://localhost:8080/druid/ ,查看 Druid 监控页面,结果如图
16.4 小结
本章节讲解了再Springboot中使用druid,并且对数据库密码进行了加密处理