第八章、removeAbandoned 连接池泄露检测

在DruidDataSource.init.initCheck 中有一句日志,不要用在线上

如何进行连接池泄露的检测
连接池泄露指的是连接资源没有close掉,没有归还到连接池

如果开启removeAbandoned,销毁独立线程会执行removeAbandoned检测一下,拿到已获取连接时间长度,如果大于阈值,且没有执行statement,将这个connection执行close方法,进行回收

为什么默认是关闭的?线上也不允许使用?
生产环境中连接的关闭应该靠程序自己保证,否则可能会隐藏问题

com.alibaba.druid.pool.DruidDataSource#getConnectionDirect

if (removeAbandoned) {
   
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    poolableConnection.connectStackTrace = stackTrace;
    poolableConnection.setConnectedTimeNano();
    poolableConnection.traceEnable = true;
    activeConnectionLock.lock();
    try {
   
        // 只有removeAbandoned开启时,才会想activeConnections里面存连接对象
        activeConnections.put(poolableConnection, PRESENT);
    } finally {
   
        activeConnectionLock
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个常用的 MySQL 连接池的推荐配置: ``` # 初始化连接数 initialSize=10 # 最大连接数 maxActive=100 # 最大空闲连接数 maxIdle=50 # 最小空闲连接数 minIdle=10 # 获取连接时的最大等待时间,单位毫秒。超过该时间将抛出异常 maxWait=5000 # 检查连接是否有效的 SQL 语句,用于保证连接池中的连接都是有效的 validationQuery=SELECT 1 # 检查连接是否有效的超时时间,单位秒 validationQueryTimeout=10 # 当连接池中的连接耗尽时,是否阻塞等待 blockWhenExhausted=true # 是否在连接池空闲时检查连接的有效性 testWhileIdle=true # 是否在从连接池中获取连接时检查连接的有效性 testOnBorrow=false # 是否在归还连接到连接池时检查连接的有效性 testOnReturn=false # 连接池中连接空闲时的最大存活时间,单位毫秒 maxIdleTime=60000 # 连接池中连接空闲时的最大存活时间,单位毫秒 maxEvictableIdleTimeMillis=1200000 # 定时清理无效连接的时间周期,单位毫秒。如果小于等于 0,则禁用清理功能 timeBetweenEvictionRunsMillis=60000 # 是否开启连接泄露检测。如果开启,当连接被应用程序泄露时会打印警告信息 removeAbandoned=false # 连接被泄露的超时时间,单位秒。如果 removeAbandoned 为 true,则应用程序获取连接后,超过该时间未归还连接,会被认为是泄露的连接 removeAbandonedTimeout=300 # 是否在发现泄露的连接时打印堆栈跟踪信息 logAbandoned=false ``` 需要注意的是,这个配置并不是适用于所有场景的,实际使用时还需要结合具体的业务场景和系统资源情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值