1.URL参数配置

1.1.实例:

jdbc:mysql://192.168.1.8:3306/mytest?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&connectTimeout=60000&socketTimeout=60000

1.2.重要参数

官方URL的key-value参考

connectTimeout

建立链接需要的时间。该参数只在建立链接阶段生效。默认是0,不超时。建议配置connectTimeout=60000,单位毫秒。

socketTimeout

发送请求给数据库(建立链接后),数据库处理的最大时间;超过这个客户端报超时超时异常(Caused by: java.net.SocketTimeoutException: Read timed out)。默认是0,不超时。建议配置socketTimeout=60000,单位毫秒。

autoReconnect

是否自动重连。默认false。mysql服务端参数wait_timeout,其默认值为 28800秒(8小时),其意义为如果一个连接闲置超过这个选项所设置的秒数,MySQL会主动断开这个连接。如果无法保证应用程序在设定的秒数内至少有一次操作,添加autoReconnect=true这个参数,即能解决这个问题。

maxReconnects

autoReconnect设置为true时,重试连接的次数,默认3。

initialTimeout

autoReconnect设置为true时,两次重连之间的时间间隔,默认2,单位:秒

useSSL

使用ssl,默认为true(5.5.45+, 5.6.26+, 5.7.6+ or 8.0.13+)。根据情况改成false

allowMultiQueries

支持批量操作:在sql语句后携带分号,实现多语句执行;执行批处理,同时发出多个SQL语句。默认为false。建议设置为true

useUnicode 和 characterEncoding

指定数据库的编解码格式。根据具体情况配置。建议配置useUnicode=true&characterEncoding=UTF-8

2.Druid连接池配置

2.1.连接池的初始值、最大值、最小值

实例:

initialSize: 5
minIdle: 6
maxActive: 10

项目启动时,会自动初始化initialSize个连接出来(没有流量访问数据库也会创建),这几个链接会一直存在。可以通过数据库命令SHOW PROCESSLIST查看初始化的链接是5个:

image-20211223155157219

当客户端查询数据库的并发小于5时,就一直使用这五个链接;当客户端的并发5时,会慢慢的新建链接,直到最多建了10个链接为止。并发大于10时,其他的请求就需要等待可用的链接。

image-20211223155600222

当客户端的流量下来后,就会回收部分空闲链接,最终保留6个链接。

image-20211223155740891

在Druid的链接池中,maxIdle已经不在使用了,

2.2.获取连接的等待时间

实例:

maxWait: 6000

获取连接池中的连接时的最大等待时间,单位是毫秒。如果这个时间内未获得可用链接则报错:nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6000, active 10, maxActive 10, creating 0。这个报错表明获取链接超时了,而且数据库的10个链接都被占用,也不能创建新的链接了。

2.3.回收连接池中的链接

实例:

timeBetweenEvictionRunsMillis: 2000
minEvictableIdleTimeMillis: 10000

访问流量大的时候,连接池中的连接数是maxActive: 10,但是当流量下来后,需要回收部分空闲的链接,最终让连接池中保留至少minIdle: 6个链接。回收的过程就需要定时对连接进行检查,判断连接是否应该回收。上面的配置就是每隔timeBetweenEvictionRunsMillis: 2000ms对连接池的连接做一次检查,如果有连接空闲时间超过minEvictableIdleTimeMillis: 10000ms就回收该链接(连接保持空闲而不被驱逐的最小时间)。

timeBetweenEvictionRunsMillis的具体作用有两个:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明。

2.4.校验链接池中的链接是否有效

实例:

validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
validationQueryTimeout:10    

校验链接是否有效。

校验的方式:使用待校验的连接在在数据库上执行一下校验的sql,这里使用SELECT 1,一定要保证改sql是该数据能执行的,不同的数据库的校验sql可能不一样。

校验的时机:通常是在连接空闲时校验(testWhileIdle: true),也可以在获取连接时校验(testOnBorrow: true,这个配置会降低性能),也可以在归还连接到连接池时校验(testOnReturn: true,这个配置会降低性能)。

validationQueryTimeout是检测连接是否有效的超时时间,单位:秒。

如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。

2.5.事务控制

# 事务控制 默认true
defaultAutoCommit: true
# 默认    
defaultTransactionisolation:    

这两个参数通常使用默认值,事务会自动提交。如果defaultAutoCommit=false,即使在不加@Transactional主键的情况下,执行DQL,在数据库中也会出现事务(当DQL执行时间较长时,可以通过SELECT * FROM information_schema.innodb_trx查看到事务的存在)。

Druid链接池的事务默认配置可以在源码中看到:

image-20211223164741929

3.阿里官方druid参考配置

Druid连接池的官方参考配置:

image-20211223163420718

DruidDataSource配置属性列表:

image-20211223164509618

Logo

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

更多推荐