1 缘起
开发了许久SpringBoot,数据源等相关配置都是使用已存的配置,
并没有深入研究参数含义,当然,自己也不会去修改相关数据,
但是,为了离自己成为调参侠这个目标更近一步,还是要一点一点补课,
下面就是我补课的成果,
分享如下。
看到了上面的这段描述,发现,怎么缘起部分越来越短了,
是不是没啥可说了,
是的,我有些词穷了,不知道如何描述当前的心态,
可是,我基本都是有感而发,如果写的少,说明当前的感受就这些。
2 入口
学习源码要找到正确的入口。
SpringBoot自动装配是一切的起点,
数据库的自动装配同样需要在自动装配中搜寻,
源码包如下:
自动装配包中找到jdbc,即可查看数据源配置,
源码结构如下图所示:
声明:
SpringBoot版本:2.4.5
3 原始参数
SpringBoot原生的数据源属性如下表所示,
序号 | 属性 | 描述 |
---|---|---|
1 | classLoader | 类加载器 |
2 | name | 数据源名称,使用嵌入的数据库的默认值为testdb |
3 | generateUniqueName | 标识位。是否生成随机数据源名称,默认为true |
4 | type | 使用的连接池全限定名,默认从classpath中自动检测,该连接池继承DataSource |
5 | driverClassName | JDBC驱动的全限定名,默认使用URL中的驱动 |
6 | url | 数据库JDBC连接 |
7 | username | 登录数据库的用户名 |
8 | password | 登录数据库密码 |
9 | jndiName | 数据源JNDI位置,当设置Class、url、username和password后可忽略该配置 |
10 | initializationMode | 应用模式。使用DDL和DML脚本初始化数据源时的应用模式,默认DataSourceInitializationMode.EMBEDDED |
11 | platform | DDL或DML脚本使用的平台,默认all,所有平台 |
12 | schema | DDL脚本资源引用 |
13 | schemaUsername | 数据库执行DDL脚本的用户名 |
14 | schemaPassword | 数据库执行DDL脚本时的密码 |
15 | data | DML脚本资源引用 |
16 | dataUsername | 数据库执行DML脚本的用户名 |
17 | dataPassword | 数据库执行DML脚本的密码 |
18 | continueOnError | 标识位。初始化数据库发生错误时是否停止,默认false |
19 | separator | SQL初始化脚本的分割符,默认英文分号; |
20 | sqlScriptEncoding | SQL脚本编码类型 |
源码如下图所示,由源码可知,使用@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 配置属性解析
这里选择了常用的属性进行解释,
希望对开发者有所帮助。
序号 | 属性 | 描述 | 默认值 |
---|---|---|---|
1 | initialSize | 初始化时建立物理连接的个数 | 0 |
2 | maxActive | 连接池最大连接数 | 8 |
3 | minIdle | 连接池中最小空闲连接数 | 0 |
4 | maxIdle | 连接池中最大空闲连接数 | 8 |
5 | maxWait | 获取连接最大等待时间,单位毫秒 | -1 |
6 | notFullTimeoutRetryCount | 连接失败未达到超时时间的重连次数 | 0 |
7 | validationQuery | 验证数据库服务可用性的查询SQL,一般设置为SELECT 1 | null |
8 | validationQueryTimeout | 验证查询超时时间 | -1 |
9 | testOnBorrow | 标识位。申请连接时检测连接是否有效,即执行validationQuery,开启影响性能 | false |
10 | testOnReturn | 标识位。归还连接时检测连接是否有效,归还连接时执行validationQuery,开启影响性能 | false |
11 | testWhileIdle | 标识位。申请连接时检测空闲时间,根据空闲时间再检测连接是否有效,不影响性能 | true |
12 | poolPreparedStatements | 标识位。是否开启预编译SQL,即PSCache | false |
13 | sharePreparedStatements | 标识位。是否共享PSCache | false |
14 | maxPoolPreparedStatementPerConnectionSize | 每个连接分配的最大预编译资源数 | 10 |
15 | queryTimeout | 查询超时时间 | 无 |
16 | transactionQueryTimeout | 事务超时时间 | 无 |
17 | maxWaitThreadCount | 等待线程的最大数量,设置后,会丢弃阻塞线程 | -1 |
18 | timeBetweenEvictionRunsMillis | 回收空闲连接时间间隔,单位毫秒 | 60000毫秒=1分钟 |
19 | minEvictableIdleTimeMillis | 回收空闲连接最小时间间隔,单位毫秒 | 1800000毫秒=30分钟 |
20 | maxEvictableIdleTimeMillis | 回收空闲连接最小时间间隔,单位毫秒 | 25200000毫秒=420分钟=7小时 |
22 | keepAliveBetweenTimeMillis | 单位毫秒 | 60000毫秒=1分钟 |
23 | phyTimeoutMillis | 最大物理连接时间,超时被强制回收 | -1 |
24 | phyMaxUseCount | 最大物理连接数,超过被强制回收 | -1 |
25 | removeAbandoned | 标识位。是否自动回收超时连接 | 无 |
26 | removeAbandonedTimeoutMillis | 超时时间超过该值后,强制回收该连接 | 300 * 1000毫秒=5分钟 |
27 | maxOpenPreparedStatements | 开启预编译最大数量,PSCache | -1 |
28 | connectionInitSqls | 连接初始化的SQL | 无 |
29 | timeBetweenConnectErrorMillis | 连接出错后重试时间间隔,单位毫秒 | 500 |
30 | validConnectionChecker | 验证连接检测对象 | null |
31 | activeConnections | 活跃连接列表 | new IdentityHashMap<DruidPooledConnection, Object>() |
32 | connectionErrorRetryAttempts | 连接错误后重试次数 | 1 |
33 | breakAfterAcquireFailure | 标识位。数据库服务器宕机后自动重连 | false |
34 | transactionThresholdMillis | 事务阈值 | 0 |
35 | preparedStatementCount | 预编译数量 | 0 |
36 | closedPreparedStatementCount | 关闭的预编译数量 | 0 |
37 | cachedPreparedStatementCount | 缓存的预编译数量 | 0 |
38 | cachedPreparedStatementDeleteCount | 缓存的预编译删除数量 | 0 |
39 | cachedPreparedStatementMissCount | 缓存的预编译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 小结
无。