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的监控。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydzsw.html