数据库连接关键参数推荐配置
一、MySQL连接参数配置(druid)
1、关键参数配置
-
连接池大小
a)对于大部分OLTP应用,推荐如下配置:
jdbc.druid.initialSize=4
jdbc.druid.minIdle=4
jdbc.druid.maxActive=12
b)针对高并发的api接口,避免瞬间创建大量连接,推荐设置 minIdle = initSize = maxActivejdbc.druid.initialSize=12
jdbc.druid.minIdle=12
jdbc.druid.maxActive=12
其中,maxActive可根据实际情况调整到最高24,并且满足:maxActive < 600/${n_app_instances}
说明:在没有慢查询情况下,SQL执行时间基本在5ms以内,单个连接SQL QPS:1000ms/5ms = 200,若配置 maxActive=12,单个应用实例可以输出SQL QPS:12*200 = 2400
-
获取连接最大等待时长
druid获取连接等待超时,推荐3000,单位毫秒
-
jdbc.druid.maxWait=3000
jdbc connect timeout
建立到MySQL Server的超时时间。推荐2000,单位毫秒
-
jdbc socket timeout
jdbc I/O socket read/write超时时间,防止因网络异常导致driver一直阻塞(dead connection),同时,为避免在获取InnoDB行锁超时之前被异常中断,不能配置低于120s(innodb_lock_wait_timeout)
a)高并发API服务,建议配置150000,单位毫秒(不能低于120000),2.5分钟可检测并恢复问题
jdbc:mysql://x.x.x.x:3306/db?connectTimeout=2000&socketTimeout=150000
b)后台系统视具体情况而定(如数据导出业务,根据需要可设置socketTimeout=600000)jdbc:mysql://x.x.x.x:3306/db?connectTimeout=2000&socketTimeout=600000
若不显式配置socketTimeout,dead conneciton在15分钟后才能被检测到(参考:TCP Timers ) -
statement timeout,需低于上述 jdbc socket timeout
-
连接池连接检测策略
推荐配置:只在空闲时检测
jdbc.druid.validationQuery=SELECT 1
jdbc.druid.testWhileIdle=true
jdbc.druid.testOnBorrow=false
jdbc.druid.testOnReturn=false
2、配置示例
参考wiki:MySQL连接池推荐配置
3、druid版本
建议使用最新版本
4、jdbc版本
系列
|
小版本
|
5.1.*
|
5.1.47及以上版本
|
6.0.*
|
禁止使用,官方已停止维护
|
8.0.*
|
8.0.13及以上版本(禁用8.0.22含bug)
|
5、其他问题
二、Redis连接参数配置
1、关键参数配置
-
testOnBorrow,testOnReturn,testWhileIdle
-
testOnBorrow=falsetestOnReturn=falsetestWhileIdle=true
maxTotal,maxIdle,minIdle
a)对大多数应用,推荐配置如下:
maxTotal=12
maxIdle=8
minIdle=4
b)针对高并发的api接口,避免瞬间创建大量连接,推荐使用固定大小连接池,配置如下:maxTotal=12
maxIdle=12
minIdle=12
说明:与MySQL类似,Redis也有connect timeout、socket timeout相关配置,若Java应用使用的是JedisPool,其默认配置了2s,参数合理,推荐使用(不显式配置即可),显式配置建议:300ms ~ 3s
2、配置示例
参考wiki:Dmall Redis 开发规范V1
参数详情:JedisPool资源池优化
3、驱动
推荐使用最新驱动
4、其他问题
库请使用db0
spring.redis.database=0