写点什么

druid 源码阅读(八)Druid 回收连接

  • 2022 年 5 月 17 日
  • 本文字数:714 字

    阅读完需:约 2 分钟

1、整体流程图

整体流程图如下:


2、DruidPooledConnection.close()

DruidPooledConnection 中的部分主要是判断关闭连接的线程和持有连接的线程是否是同一个线程。

boolean isSameThread = this.getOwnerThread() == Thread.currentThread();
复制代码

根据这个判断来决定是否对整个关闭流程加锁,如果不是同一个线程,就需要加锁,保证线程安全。

DruidPooledConnection 中的关闭流程比较简单,就是先通过观察者模式通知 ConnectionEventListener 连接已关闭,再通过责任链模式调用所有加载的 Filter 进行连接关闭操作。最后调用 DruidDataSource 的 recycle()方法。

3、DruidDataSource.recycle()

这个方法是整个流程中的关键部分,他在判断关闭线程和持有线程不是一个线程后会打印警告,但不会中断流程。

LOG.warn("get/close not same thread");
复制代码

接下来的流程如下

1、移除使用中的连接池中的当前连接

2、对需要回滚的进行回滚操作

3、对连接使用次数超过设置的物理连接最大使用次数后,丢弃连接

if (phyMaxUseCount > 0 && holder.useCount >= phyMaxUseCount) {    discardConnection(holder);    return;}
复制代码

这个操作主要是因为一个物理连接使用次数过多后会在数据库端产生一些无法释放的内存占用,会对数据库性能产生影响。

4、如果设置了 testOnReturn,就需要检查连接可用性,不可用连接会直接丢弃。

5、连接使用时间超过设置的时间,连接也会被丢弃,这个和第三步同理。

        if (phyTimeoutMillis > 0) {            long phyConnectTimeMillis = currentTimeMillis - holder.connectTimeMillis;            if (phyConnectTimeMillis > phyTimeoutMillis) {                discardConnection(holder);                return;            }        }
复制代码


用户头像

还未添加个人签名 2021.05.30 加入

还未添加个人简介

评论

发布
暂无评论
druid 源码阅读(八)Druid 回收连接_5月月更_爱晒太阳的大白_InfoQ写作社区