Druid

发布时间 2023-12-13 13:46:20作者: z_uncle

Druid 参数

Pasted image 20230718161105.png

https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

https://dev.mysql.com/doc/connector-j/8.1/en/connector-j-reference-configuration-properties.html

spring.datasource.url = jdbc:mysql://HOST:Port/Dbname?autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=3000&socketTimeout=10000
spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.datasource.initialSize = 10
spring.datasource.minIdle = 5
spring.datasource.maxActive = 30
spring.datasource.maxWait = 60000

spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 300000
spring.datasource.validationQuery = SELECT 1 FROM DUAL

spring.datasource.testWhileIdle = true
spring.datasource.testOnBorrow = false
spring.datasource.testOnReturn = false
    
参数项 参数说明 默认值 推荐值
useLocalSessionState 配置驱动程序是否使用autocommit,read_only和transaction isolation的本地属性值,避免JDBC driver每次都去检查server端是否是ReadOnly,autocommit false true
allowMultiQueries 控制 jdbc 连接 db 时,是否需要 proxy支持对客户端同时发送给proxy的多个语句分别进行处理,但不会影响rewriteBatchStatements的addBatch()和executeBatch()方法。
分布式实例中必须开启网关参数 gateway.mode.multi_query.open=1
false true
useUnicode 是否使用Unicode字符集。强制使用mysql本身不支持的字符集时需要使用该参数characterEncoding=gbk&useUnicode=true 表示使用gbk字符集,按需配置 false true
characterEncoding 字符编码格式。当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk    
serverTimezone 时区设置,建议中国区部署设置为Asia/Shanghai LOCAL Asia/Shanghai
netTimeoutForStreamingResults 使用场景:一般在网络条件比较差的时,或者客户端处理每个block耗时比较长时
当使用StremResultSet结果集时,建议配置该参数为0(即应用端不配置,直接使用数据库服务器超时时间),保证使用数据库的默认超时时间,当服务端等待时间超过60秒,服务端会与客户端断链,JDBC抛出异常: Communications link failure
600 0
useCursorFetch 使用游标开关,但分布式实例不支持游标,建议关闭,在分布式场景下可以在应用层采用流式查询进行替代改造 true false
useSSL(参数已被 sslMode代替,可通用使用) 与数据库之间连接是否使用加密连接。建议互联网部署应用开启加密连接。开启后由于数据链路加密传输,影响部分性能。非互联网应用按需配置。说明:tdsql网关节点进已进行适配,默认开启useSSL后,jdbc参数中无需配置allowPublicKeyRetrieval=true(关闭方式:useSSL=false,或sslMode=DISABLED) true  
useServerPrepStmts 是否开启服务端预编译模式,如果开启则能让服务端执行预处理语句。(需要服务端支持) true true
cachePrepStmts 是否开启缓存预处理语句的功能,如果开启,jdbc会缓存预处理statement信息,而不需要每次都重新发起预编译;

tdsql不建议开启该参数
false false
prepStmtCacheSqlLimit 预处理语句长度限制,该配置控制客户端缓存预处理语句的最大长度,超过该长度将不会被缓存。 256 视内存情况尽量调大
prepStmtCacheSize 可以缓存预处理语句的个数,采用LRU队列缓存,当达到最大预处理语句个数时,替换最久未被使用的预处理语句。 25 视内存情况尽量调大
rewriteBatchedStatements 是否开启构造多值批量插入功能,用于保证jdbc driver可以批量执行SQL,按需配置   batch相关
connectTimeout socket连接超时(以毫秒为单位),0表示无超时。如果与数据库请求建立连接的时间超过ConnectionTimeOut,就会ConnectionTimeOutException。 0 建议综合考虑业务实际负载情况,选择超时时间。
socketTimeout 网络socket操作超时(以毫秒为单位)。默认值0表示没有超时。如果服务器处理数据用时过长,超过了SocketTimeOut,就会抛出SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。 0 建议根据业务最慢语句的执行时间来设置超时时间。
   
参数项 参数说明 配置建议
initial-size 初始化时建立物理连接的个数 初始化连接数,一般10以内可以满足。
max-active 最大连接池数量 一般情况下配置max-active=20以内已经够用,可根据实际业务情况调整,不建议配置太大,对db而言过多连接反而会降低吞吐
min-idle 最小连接池数量 druid定期扫描该配置以维持最小空闲连接数,一般10以内,可与initial-size设置成一样。
max-wait 获取连接时最大等待时间,单位毫秒 指应用线程等待连接的超时。可以配几秒范围,根据业务应用实际情况进行判定。
time-between-eviction-runs-millis 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 1) Destroy 线程会检测连接的间隔时间,如果连接空闲时间大于等于min-evictable-idle-time-millis则关闭物理连接。

2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

建议保值默认值60000即可
min-evictable-idle-time-millis 连接保持空闲而不被驱逐的最小时间 建议保持默认值300000即可
validation-query 用来检测连接是否有效的sql,要求是一个查询语句 相当于心跳健康检查的判定语句,建议发送有效的非业务简单查询sql,如SELECT 1,如果validation-query为null,test-while-idle、test-on-borrow、test-on-return都不会起作用。
test-while-idle 设置从连接池获取连接时是否检查连接有效性,设置true时,如果连接空闲时间超过min-evictable-idle-time-millis进行检查,否则不检查;false时,不检查 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,
test-on-borrow 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 从连接池里取出时,连接池是否需要对连接进行健康探测,会影响性能,建议设置false,除非网络极端不稳定情况下确保连接可靠性开启。
test-on-return 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 归还到连接池时进行健康检查,会影响性能,建议设置false。
pool-prepared-statements 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大。 TDSQL分布式实例不支持游标,建议设置false;集中式实例如果有用到游标建议设置true。
max-pool-prepared-statement-per-connection-size 开启PSCache每个连接最多缓存多少条SQL 要启用PSCache,必须配置大于0,当大于0时,pool-prepared-statements自动触发修改为true。
remove-abandoned 连接泄露检查,连接从连接池借出后,长时间不归还,将触发强制回连接。回收周期随time-between-eviction-runs-millis进行,如果连接为从连接池借出状态,并且未执行任何sql,并且从借出时间起已超过remove-abandoned-timeout时间,则强制归还连接到连接池中。 建议保持默认false即可,对连接泄漏场景敏感可根据实际情况考虑。
remove-abandoned-timeout 设置druid强制回收连接的时限,当程序从池中get到连接开始算起,druid将强制回收该连接,单位秒。 如果需要开启remove-abandoned,建议该项配置时间不要太短,因为业务长时间使用连接,所以超时时间要比业务实际合理时间要长。