Spring Boot 2.x基础教程:使用国产数据库连接池Druid
上一节,我们介绍了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/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/
,可以看到如下登录页面:
输入上面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:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
欢迎关注我的公众号:程序猿DD,获得独家整理的学习资源和日常干货推送。如果您对我的专题内容感兴趣,也可以关注我的博客:didispace.com

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
02月14日云栖号头条:阿里巴巴已采购并捐赠超4000万件医疗物资支持抗疫
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯: 2月13日,在阿里巴巴财报电话会上,阿里巴巴集团董事会主席兼首席执行官张勇表示,截至目前,阿里巴巴已采购超过4000万件医疗物资,送往武汉和其它受疫情影响的地区,价值人民币4.68亿元;2月13日晚间消息,阿里巴巴第三财季营收1614亿元,集团收入同比增长38%,其中,本地生活服务营收75.84亿元,同比增长47%。 一起来看最新的资讯: 张勇:阿里巴巴已采购并捐赠超4000万件医疗物资支持抗疫 疫情发生以后,阿里巴巴发挥数字经济生态的商业力量和技术力量,全力积极参与对疫区的物资援助和生活保障。1月25日,阿里巴巴宣布设立人民币10亿元医疗物资供给专项基金。1月25日,菜鸟联合全球物流业开通物流“绿色通道”,免费为武汉地区和其它受疫情影响地区运输社会捐赠的救援物资,菜鸟“绿色通道”已向武汉等地累计运送2600万件来自海内外捐赠的医疗物资。达摩院免费为防疫机构提供疫情防控智能呼叫平台,高效率完成重点目标人群的智能语...
- 下一篇
Jenkins 创始人 Kohsuke 的新篇章
本文首发于: Jenkins 中文社区 原文链接作者:kohsuke 译者:zhaoying Jenkins 创始人 Kohsuke 的新篇章 Jenkins 创始人 Kohsuke 即将退出 Jenkins,并投身于一个新的创业公司 Launchable 2020 年对我来说将是转变的一年。在 1 月底,我将正式退出 Jenkins,将我在CloudBees的角色转换为顾问,并将注意力转向我的新创业公司。这篇文章的其余部分将结合这种过渡的背景,如果您没有与我紧密合作,这可能会令您惊讶。 Jenkins 之旅充满神奇,而且从未间断。我非常喜欢这一切,尤其是与造就 Jenkins 如今成就的世界各地的用户会面与交流。作为项目的创建者,在某个时候,我开始想如何将火炬传递给下一任领导者,如何使人们继续推动它前进。如今,由于有了 CloudBees 和社区,新一代的才华横溢、有才干的领导者正在热情地推动事情向前发展,这真令人高兴。例如,新选举的董事会成员和Jenkins X的伙伴们。这些新人带来了新的文化和新的代码,并且总的来说,这产生了积极的影响,使 Jenkins 不再局限于我所谈论的局...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8编译安装MySQL8.0.19