点击上方蓝色“程序猿DD”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
作者 | 翟永超
来源 |/spring-boot-learning-21-3-3/
上一节,我们介绍了Spring Boot在JDBC模块中自动化配置使用的默认数据源HikariCP。接下来这一节,我们将介绍另外一个被广泛应用的开源数据源:Druid。
Druid 是由阿里巴巴数据库事业部出品的开源项目。它除了是一个高性能数据库连接池之外,更是一个自带监控的数据库连接池。虽然HikariCP已经很优秀,但是对于国内用户来说,可能对于Druid更为熟悉。所以,对于如何在Spring Boot中使用Druid是后端开发人员必须要掌握的基本技能。
配置Druid数据源
这一节的实践我们将基于《Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库》一文的代码基础上进行。所以,读者可以从文末的代码仓库中,检出chapter3-1
目录来进行下面的实践学习。
下面我们就来开始对Spring Boot项目配置Druid数据源:
第一步:在pom.xml
中引入druid官方提供的Spring Boot Starter封装。
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version></dependency>
第二步:在application.properties
中配置数据库连接信息。
Druid的配置都以spring.datasource.druid
作为前缀,所以根据之前的配置,稍作修改即可:
spring.datasource.druid.url=jdbc:mysql://localhost:3306/testspring.datasource.druid.username=rootspring.datasource.druid.password=spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
第三步:配置Druid的连接池。
与Hikari一样,要用好一个数据源,就要对其连接池做好相应的配置,比如下面这样:
spring.datasource.druid.initialSize=10spring.datasource.druid.maxActive=20spring.datasource.druid.maxWait=60000spring.datasource.druid.minIdle=1spring.datasource.druid.timeBetweenEvictionRunsMillis=60000spring.datasource.druid.minEvictableIdleTimeMillis=300000spring.datasource.druid.testWhileIdle=truespring.datasource.druid.testOnBorrow=truespring.datasource.druid.testOnReturn=falsespring.datasource.druid.poolPreparedStatements=truespring.datasource.druid.maxOpenPreparedStatements=20spring.datasource.druid.validationQuery=SELECT 1spring.datasource.druid.validation-query-timeout=500spring.datasource.druid.filters=stat
关于Druid中各连接池配置的说明可查阅下面的表格:
到这一步,就已经完成了将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=truespring.datasource.druid.stat-view-servlet.url-pattern=/druid/*spring.datasource.druid.stat-view-servlet.reset-enable=truespring.datasource.druid.stat-view-servlet.login-username=adminspring.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@RestControllerpublic 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/
,可以看到如下登录页面:
输入上面spring.datasource.druid.stat-view-servlet.login-username
和spring.datasource.druid.stat-view-servlet.login-password
配置的登录账户与密码,就能看到如下监控页面:
进入到这边时候,就可以看到对于应用端而言的各种监控数据了。这里讲解几个最为常用的监控页面:
数据源:这里可以看到之前我们配置的数据库连接池信息以及当前使用情况的各种指标。
SQL监控:该数据源中执行的SQL语句极其统计数据。在这个页面上,我们可以很方便的看到当前这个Spring Boot都执行过哪些SQL,这些SQL的执行频率和执行效率也都可以清晰的看到。如果你这里没看到什么数据?别忘了我们之前创建了一个Controller,用这些接口可以触发UserService对数据库的操作。所以,这里我们可以通过调用接口的方式去触发一些操作,这样SQL监控页面就会产生一些数据:
图中监控项上,执行时间、读取行数、更新行数都通过区间分布的方式表示,将耗时分布成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防御维度的统计。
该功能数据记录的统计需要在spring.datasource.druid.filters
中增加wall
属性才会进行记录统计,比如这样:
spring.datasource.druid.filters=stat,wall
注意:这里的所有监控信息是对这个应用实例的数据源而言的,而并不是数据库全局层面的,可以视为应用层的监控,不可能作为中间件层的监控。
代码示例
本文的相关例子可以查看下面仓库中的chapter3-3
目录:
Github:/dyc87112/SpringBoot-Learning/
Gitee:/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
本文通过OpenWrite的Markdown转换工具发布
关注我,回复“加群”加入各种主题讨论群
本系列连载目录
快速入门
Spring Boot 2.x:版本关系
Spring Boot 2.x:快速入门
Spring Boot 2.x:工程结构推荐
Spring Boot 2.x:配置文件详解
Web开发
Spring Boot 2.x:构建RESTful API与单元测试
Spring Boot 2.x:使用Swagger2构建强大的API文档
Spring Boot 2.x:JSR-303实现请求参数校验
Spring Boot 2.x:Swagger接口分类与各元素排序问题详解
Spring Boot 2.x:Swagger静态API文档的生成
数据访问
Spring Boot 2.x:使用JdbcTemplate访问MySQL数据库
Spring Boot 2.x:默认数据源Hikari的配置详解
武汉加油!中国加油!