1 缘起

开发了许久SpringBoot,数据源等相关配置都是使用已存的配置,
并没有深入研究参数含义,当然,自己也不会去修改相关数据,
但是,为了离自己成为调参侠这个目标更近一步,还是要一点一点补课,
下面就是我补课的成果,
分享如下。


看到了上面的这段描述,发现,怎么缘起部分越来越短了,
是不是没啥可说了,
是的,我有些词穷了,不知道如何描述当前的心态,
可是,我基本都是有感而发,如果写的少,说明当前的感受就这些。

2 入口

学习源码要找到正确的入口。
SpringBoot自动装配是一切的起点,
数据库的自动装配同样需要在自动装配中搜寻,
源码包如下:
在这里插入图片描述
自动装配包中找到jdbc,即可查看数据源配置,
源码结构如下图所示:
在这里插入图片描述

声明:

SpringBoot版本:2.4.5

3 原始参数

SpringBoot原生的数据源属性如下表所示,

序号属性描述
1classLoader类加载器
2name数据源名称,使用嵌入的数据库的默认值为testdb
3generateUniqueName标识位。是否生成随机数据源名称,默认为true
4type使用的连接池全限定名,默认从classpath中自动检测,该连接池继承DataSource
5driverClassNameJDBC驱动的全限定名,默认使用URL中的驱动
6url数据库JDBC连接
7username登录数据库的用户名
8password登录数据库密码
9jndiName数据源JNDI位置,当设置Class、url、username和password后可忽略该配置
10initializationMode应用模式。使用DDL和DML脚本初始化数据源时的应用模式,默认DataSourceInitializationMode.EMBEDDED
11platformDDL或DML脚本使用的平台,默认all,所有平台
12schemaDDL脚本资源引用
13schemaUsername数据库执行DDL脚本的用户名
14schemaPassword数据库执行DDL脚本时的密码
15dataDML脚本资源引用
16dataUsername数据库执行DML脚本的用户名
17dataPassword数据库执行DML脚本的密码
18continueOnError标识位。初始化数据库发生错误时是否停止,默认false
19separatorSQL初始化脚本的分割符,默认英文分号;
20sqlScriptEncodingSQL脚本编码类型

源码如下图所示,由源码可知,使用@ConfigrationProperties映射前缀:spring.datasource,
位置:org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
在这里插入图片描述

4 Druid参数

数据源的类型选择为:com.alibaba.druid.pool.DruidDataSource
因此,可以继续使用Durid数据源配置其他高级属性,
如最大连接数、获取最大等待时间、连接错误重试等等,
不得不说,阿里工程师非常优秀,
但是,槽点:无注释,只能通过变量猜以及通过网络搜索。

4.1 Druid数据源属性

Druid数据源提供的属性非常之多,
先看下入口源码,如题下图所示,
位置:com.alibaba.druid.pool.DruidDataSource
在这里插入图片描述

4.2 Durid数据源默认值

Druid数据源非常多,用户使用时很多参数用户会用不到,
但是,需要有默认值,因此,Druid通过抽象类为数据源添加默认值,
源码如下图所示,
位置:com.alibaba.druid.pool.DruidAbstractDataSource
在这里插入图片描述

4.3 配置属性解析

这里选择了常用的属性进行解释,
希望对开发者有所帮助。

序号属性描述默认值
1initialSize初始化时建立物理连接的个数0
2maxActive连接池最大连接数8
3minIdle连接池中最小空闲连接数0
4maxIdle连接池中最大空闲连接数8
5maxWait获取连接最大等待时间,单位毫秒-1
6notFullTimeoutRetryCount连接失败未达到超时时间的重连次数0
7validationQuery验证数据库服务可用性的查询SQL,一般设置为SELECT 1null
8validationQueryTimeout验证查询超时时间-1
9testOnBorrow标识位。申请连接时检测连接是否有效,即执行validationQuery,开启影响性能false
10testOnReturn标识位。归还连接时检测连接是否有效,归还连接时执行validationQuery,开启影响性能false
11testWhileIdle标识位。申请连接时检测空闲时间,根据空闲时间再检测连接是否有效,不影响性能true
12poolPreparedStatements标识位。是否开启预编译SQL,即PSCachefalse
13sharePreparedStatements标识位。是否共享PSCachefalse
14maxPoolPreparedStatementPerConnectionSize每个连接分配的最大预编译资源数10
15queryTimeout查询超时时间
16transactionQueryTimeout事务超时时间
17maxWaitThreadCount等待线程的最大数量,设置后,会丢弃阻塞线程-1
18timeBetweenEvictionRunsMillis回收空闲连接时间间隔,单位毫秒60000毫秒=1分钟
19minEvictableIdleTimeMillis回收空闲连接最小时间间隔,单位毫秒1800000毫秒=30分钟
20maxEvictableIdleTimeMillis回收空闲连接最小时间间隔,单位毫秒25200000毫秒=420分钟=7小时
22keepAliveBetweenTimeMillis单位毫秒60000毫秒=1分钟
23phyTimeoutMillis最大物理连接时间,超时被强制回收-1
24phyMaxUseCount最大物理连接数,超过被强制回收-1
25removeAbandoned标识位。是否自动回收超时连接
26removeAbandonedTimeoutMillis超时时间超过该值后,强制回收该连接300 * 1000毫秒=5分钟
27maxOpenPreparedStatements开启预编译最大数量,PSCache-1
28connectionInitSqls连接初始化的SQL
29timeBetweenConnectErrorMillis连接出错后重试时间间隔,单位毫秒500
30validConnectionChecker验证连接检测对象null
31activeConnections活跃连接列表new IdentityHashMap<DruidPooledConnection, Object>()
32connectionErrorRetryAttempts连接错误后重试次数1
33breakAfterAcquireFailure标识位。数据库服务器宕机后自动重连false
34transactionThresholdMillis事务阈值0
35preparedStatementCount预编译数量0
36closedPreparedStatementCount关闭的预编译数量0
37cachedPreparedStatementCount缓存的预编译数量0
38cachedPreparedStatementDeleteCount缓存的预编译删除数量0
39cachedPreparedStatementMissCount缓存的预编译miss数量0

5 配置样例

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_monkey_run?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 6000
      filters: stat, wall
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: 123456

6 小结

无。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐