Spring Boot 2.x基础教程:使用国产数据库链接池Druid

上一节,咱们介绍了Spring Boot在JDBC模块中自动化配置使用的默认数据源HikariCP。接下来这一节,咱们将介绍另一个被普遍应用的开源数据源:Druid。mysql

Druid是由阿里巴巴数据库事业部出品的开源项目。它除了是一个高性能数据库链接池以外,更是一个自带监控的数据库链接池。虽然HikariCP已经很优秀,可是对于国内用户来讲,可能对于Druid更为熟悉。因此,对于如何在Spring Boot中使用Druid是后端开发人员必需要掌握的基本技能。git

配置Druid数据源

这一节的实践咱们将基于《Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库》一文的代码基础上进行。因此,读者能够从文末的代码仓库中,检出chapter3-1目录来进行下面的实践学习。github

下面咱们就来开始对Spring Boot项目配置Druid数据源:spring

第一步:在pom.xml中引入druid官方提供的Spring Boot Starter封装。sql

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

第二步:在application.properties中配置数据库链接信息。数据库

Druid的配置都以spring.datasource.druid做为前缀,因此根据以前的配置,稍做修改便可:segmentfault

spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

第三步:配置Druid的链接池。后端

与Hikari同样,要用好一个数据源,就要对其链接池作好相应的配置,好比下面这样:缓存

spring.datasource.druid.initialSize=10
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.minIdle=1
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=true
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxOpenPreparedStatements=20
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validation-query-timeout=500
spring.datasource.druid.filters=stat

关于Druid中各链接池配置的说明可查阅下面的表格:安全

配置 缺省值 说明
name 配置这个属性的意义在于,若是存在多个数据源,监控的时候能够经过名字来区分开来。若是没有配置,将会生成一个名字,格式是:”DataSource-“ + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起做用的,强行设置name会出错。详情-点此处
url 链接数据库的url,不一样数据库不同。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 链接数据库的用户名
password 链接数据库的密码。若是你不但愿密码直接写在配置文件中,可使用ConfigFilter。详细看这里
driverClassName 根据url自动识别 这一项可配可不配,若是不配置druid会根据url自动识别dbType,而后选择相应的driverClassName
initialSize 0 初始化时创建物理链接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive 8 最大链接池数量
maxIdle 8 已经再也不使用,配置了也没效果
minIdle 最小链接池数量
maxWait 获取链接时最大等待时间,单位毫秒。配置了maxWait以后,缺省启用公平锁,并发效率会有所降低,若是须要能够经过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提高巨大,好比说oracle。在mysql下建议关闭。
maxPoolPreparedStatementPerConnectionSize -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改成true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,能够把这个数值配置大一些,好比说100
validationQuery 用来检测链接是否有效的sql,要求是一个查询语句,经常使用select ‘x’。若是validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起做用。
validationQueryTimeout 单位:秒,检测链接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
testOnBorrow true 申请链接时执行validationQuery检测链接是否有效,作了这个配置会下降性能。
testOnReturn false 归还链接时执行validationQuery检测链接是否有效,作了这个配置会下降性能。
testWhileIdle false 建议配置为true,不影响性能,而且保证安全性。申请链接的时候检测,若是空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测链接是否有效。
keepAlive false (1.0.28) 链接池中的minIdle数量之内的链接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操做。
timeBetweenEvictionRunsMillis 1分钟(1.0.14) 有两个含义: 1) Destroy线程会检测链接的间隔时间,若是链接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理链接。 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun 30分钟(1.0.14) 再也不使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis 链接保持空闲而不被驱逐的最小时间
connectionInitSqls 物理链接初始化的时候执行的sql
exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃链接
filters 属性类型是字符串,经过别名的方式配置扩展插件,经常使用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防护sql注入的filter:wall
proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,若是同时配置了filters和proxyFilters,是组合关系,并不是替换关系

到这一步,就已经完成了将Spring Boot的默认数据源HikariCP切换到Druid的全部操做。

配置Druid监控

既然用了Druid,那么对于Druid的监控功能怎么能不用一下呢?下面就来再进一步作一些配置,来启用Druid的监控。

第一步:在pom.xml中引入spring-boot-starter-actuator模块

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

第二步:在application.properties中添加Druid的监控配置。

spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

上面的配置主要用于开启stat监控统计的界面以及监控内容的相关配置,具体释意以下:

  • spring.datasource.druid.stat-view-servlet.url-pattern:访问地址规则
  • spring.datasource.druid.stat-view-servlet.reset-enable:是否容许清空统计数据
  • spring.datasource.druid.stat-view-servlet.login-username:监控页面的登陆帐户
  • spring.datasource.druid.stat-view-servlet.login-password:监控页面的登陆密码

第三步:针对以前实现的UserService内容,咱们建立一个Controller来经过接口去调用数据访问操做:

@Data
@AllArgsConstructor
@RestController
public class UserController {

    private UserService userService;

    @PostMapping("/user")
    public int create(@RequestBody User user) {
        return userService.create(user.getName(), user.getAge());
    }

    @GetMapping("/user/{name}")
    public List<User> getByName(@PathVariable String name) {
        return userService.getByName(name);
    }

    @DeleteMapping("/user/{name}")
    public int deleteByName(@PathVariable String name) {
        return userService.deleteByName(name);
    }

    @GetMapping("/user/count")
    public int getAllUsers() {
        return userService.getAllUsers();
    }

    @DeleteMapping("/user/all")
    public int deleteAllUsers() {
        return userService.deleteAllUsers();
    }

}

第四步:完成上面全部配置以后,启动应用,访问Druid的监控页面http://localhost:8080/druid/,能够看到以下登陆页面:

img

输入上面spring.datasource.druid.stat-view-servlet.login-usernamespring.datasource.druid.stat-view-servlet.login-password配置的登陆帐户与密码,就能看到以下监控页面:

img

进入到这边时候,就能够看到对于应用端而言的各类监控数据了。这里讲解几个最为经常使用的监控页面:

数据源:这里能够看到以前咱们配置的数据库链接池信息以及当前使用状况的各类指标。

img

SQL监控:该数据源中执行的SQL语句极其统计数据。在这个页面上,咱们能够很方便的看到当前这个Spring Boot都执行过哪些SQL,这些SQL的执行频率和执行效率也均可以清晰的看到。若是你这里没看到什么数据?别忘了咱们以前建立了一个Controller,用这些接口能够触发UserService对数据库的操做。因此,这里咱们能够经过调用接口的方式去触发一些操做,这样SQL监控页面就会产生一些数据:

img

图中监控项上,执行时间、读取行数、更新行数都经过区间分布的方式表示,将耗时分布成8个区间:

  • 0 - 1 耗时0到1毫秒的次数
  • 1 - 10 耗时1到10毫秒的次数
  • 10 - 100 耗时10到100毫秒的次数
  • 100 - 1,000 耗时100到1000毫秒的次数
  • 1,000 - 10,000 耗时1到10秒的次数
  • 10,000 - 100,000 耗时10到100秒的次数
  • 100,000 - 1,000,000 耗时100到1000秒的次数
  • 1,000,000 - 耗时1000秒以上的次数

记录耗时区间的发生次数,经过区分分布,能够很方便看出SQL运行的极好、普通和极差的分布。 耗时区分分布提供了“执行+RS时分布”,是将执行时间+ResultSet持有时间合并监控,这个能方便诊断返回行数过多的查询。

SQL防火墙:该页面记录了与SQL监控不一样维度的监控数据,更多用于对表访问维度、SQL防护维度的统计。

img

该功能数据记录的统计须要在spring.datasource.druid.filters中增长wall属性才会进行记录统计,好比这样:

spring.datasource.druid.filters=stat,wall

注意:这里的全部监控信息是对这个应用实例的数据源而言的,而并非数据库全局层面的,能够视为应用层的监控,不可能做为中间件层的监控。

代码示例

本文的相关例子能够查看下面仓库中的chapter3-3目录:

若是您以为本文不错,欢迎Star支持,您的关注是我坚持的动力!

欢迎关注个人公众号:程序猿DD,得到独家整理的学习资源和平常干货推送。
若是您对个人专题内容感兴趣,也能够关注个人博客: didispace.com
相关文章
相关标签/搜索