跳到主要内容

Druid 配置参数

keepAlive

  • 保持连接的有效性,也就是跟数据库续租;
  • 当连接的空闲时间大于 keepAliveBetweenTimeMillis(默认2分钟),但是小于 minEvictableIdleTimeMillis(默认30分钟),Druid 会通过调用 validationQuery 保持该连接的有效性。
  • 当连接空闲时间大于 minEvictableIdleTimeMillis,Druid 会直接将该连接关闭,keepAlive 会无效。

validationQuery

  • Druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同:

    DataBasevalidationQuery
    MySQLSELECT 1(validationQuery 不起作用,Mysql 会使用 ping 的方式验证
    HSQLDBSELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
    OracleSELECT 1 FROM DUAL, SELECT 'x' FROM DUAL
    DB2SELECT 1 FROM SYSIBM.SYSDUMMY1
    SqlServerSELECT 1
    PGSELECT VERSION()
    INGRESSELECT 1, SELECT 'x'
    DERBYVALUES 1
    H2SELECT 1
  • 当 Druid 遇到 testWhileIdle,testOnBorrow,testOnReturn 时,就会验证连接的有效性

    • 如果有相关数据库的 ValidConnectionChecker,则使用 ValidConnectionChecker 验证
    • Druid 提供常用数据库的 ValidConnectionChecker:MSSQLValidConnectionChecker,MySqlValidConnectionChecker,OracleValidConnectionChecker,PGValidConnectionChecker

testWhileIdle

  • 如果为 true(默认 true),当应用向连接池申请连接,并且 testOnBorrow 为 false 时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用。
  • 生效配置
    • 获取连接时;
    • testOnBorrow == false
    • testWhileIdle == true

注意:此时判断连接空闲的依据是空闲时间大于 timeBetweenEvictionRunsMillis(默认1分钟),并不是使用minEvictableIdleTimeMillis 跟 maxEvictableIdleTimeMillis,也就是说如果连接空闲时间超过一分钟就测试一下连接的有效性,但并不是直接剔除;而如果空闲时间超过了 minEvictableIdleTimeMillis 则会直接剔除。

testOnReturn

  • 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用。
  • 当连接使用完,调用 commit 或者 rollback 方法后,连接池会回收该连接,该参数主要在 DruidDataSource 的 recycle 方法中用到

testOnBorrow

  • 如果为 true(默认 false),当应用向连接池申请连接时,连接池会判断这条连接是否是可用的。
  • 如果 Mysql 数据库,使用 MySqlValidConnectionChecker 的 isValidConnection 进行判断;
  • 如果是其他数据库,则使用 validationQuery 判断;
  • 验证不通过则会直接关闭该连接,并重新从连接池获取下一条连接;

maxEvictableIdleTimeMillis

  • 判断一条连接是否为 Idele 状态
  • 最小空闲时间,默认 30 分钟,如果连接池中非运行中的连接数大于 minIdle,并且那部分连接的非运行时间大于minEvictableIdleTimeMillis,则连接池会将那部分连接设置成 Idle 状态并关闭;
  • 如果一条连接30分钟都没有使用到,并且这种连接的数量超过了 minIdle,则这些连接就会被关闭了。

minEvictableIdleTimeMillis

  • 判断一条连接是否为 Idele 状态
  • 最大空闲时间,默认 7 小时,如果 minIdle 设置得比较大,连接池中的空闲连接数一直没有超过 minIdle,这时那些空闲连接是不是一直不用关闭?当然不是,如果连接太久没用,数据库也会把它关闭,这时如果连接池不把这条连接关闭,系统就会拿到一条已经被数据库关闭的连接。为了避免这种情况,Druid 会判断池中的连接如果非运行时间大于 maxEvictableIdleTimeMillis,也会强行把它关闭,而不用判断空闲连接数是否小于 minIdle;

minIdle

  • 连接池中的最小空闲连接数,Druid 会定时扫描连接池的连接,如果空闲的连接数大于该值,则关闭多余的连接,反之则创建更多的连接以满足最小连接数要求。
  • 设置这个参数可以应对突发流量,如果没有设置空闲连接,当有多个请求同时调用数据库,但是连接池中并没有可用连接,这时就必须创建连接,创建连接是一个非常耗时的操作,有可能会导致请求超时。
  • 当连接池初始化时,会初始化一个定时清除空闲连接的任务 DestroyTask,该任务默认是1分钟执行一次(使用timeBetweenEvictionRunsMillis 参数设置)

removeAbandoned

  • 如果连接泄露,是否需要回收泄露的连接,默认 false;
  • 如果设置为 true,Druid 会定期检查池中借出去的连接是否处于运行状态,如果不是处于运行状态,并且借出时间超过 removeAbandonedTimeoutMillis(默认5分钟)就会回收该连接。

数据库连接泄露:如果在某次使用或者某段程序中没有正确地关闭 Connection、Statement、ResultSet 资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏;此外,连接这样只是从连接池中拿出来了,但是再也不会还回去了,这样就导致了连接池中的连接很快就消耗光了,即 activeCount=maxActive。

logAbandoned

  • 如果回收了泄露的连接,是否要打印一条 log,默认 false;

removeAbandonedTimeoutMillis

  • 连接回收的超时时间,默认 5 分钟;

timeBetweenEvictionRunsMillis

  • 作为 DestroyTask 执行的时间周期,DestroyTask 主要有两个作用:
    • 判断连接池的连接空闲数是否大于 minIdle,如果是则关闭多余的连接,反之则新增连接(minIdle)
    • 回收连接池泄露的连接(removeAbandoned)
  • 作为验证连接是否有效的时间周期,如果 testOnBorrow == false 并且 testWhileIdle == true,则在应用获取连接的时候会判断连接的空闲时间是否大于 timeBetweenEvictionRunsMillis,如果大于则会验证该连接是否有效。
  • 作用
    • 可以用来控制空闲连接数的回收周期
    • 可以用来控制回收泄露连接的周期
    • 连接的空闲时间大于该值testWhileIdle才起作用

maxWait

  • 从连接池中获取连接的最大等待时间,单位 ms,默认为 -1 会一直等待下去
  • 设置这个参数,如果是获取连接超时,更容易从日志中获取调用失败的原因
  • maxWait 默认是不超时,即如果连接池没有空闲连接,则会一直等待下去,但是一般的接口都是有超时时间的,如果接口超时,不方便定位出来是否是获取不到连接导致的,所以最好设置 maxWait,并且小于接口的超时时间。

maxActive

  • maxActive:连接池中的最大连接数,连接池中的连接包含三部分(这三部分的连接总和不能超过 maxActive)
    • activeCount:正在使用的连接
    • poolingCount:连接池中的空闲连接
    • createTaskCount:正在生成的连接
  • 数据库的连接总数是有限制的,有时候应用多连接少,只能限制每个应用的连接数了。
  • 在 CreateConnectionTask 中,会防止创建超过 maxActive 数量的连接

initialSize

  • 连接池初始化时初始化的数据库连接数
  • 当项目第一次进行 CRUD 的时候,连接池会初始化,这个时候会根据 initialSize 参数初始化数据库连接放入连接池中。
  • 连接池初始化时应该初始化的物理连接数,这个值越大,第一次调用数据库时越慢。