返回

走进Druid源码:揭秘DruidDataSource的shrink过程

后端

在Druid数据源的管理中,"shrink"过程扮演着至关重要的角色。它负责回收闲置连接,释放数据库资源,从而提高Druid的整体效率。本文将深入Druid源码,带你探究DruidDataSource的shrink过程,了解其原理和实现细节。

进入shrink过程

DruidDataSource的shrink过程由DestroyTask线程触发,具体执行方法为shrink方法。在进入shrink方法前,线程会先获取一个锁:

final Object shrinkLock = new Object();
synchronized (shrinkLock) {

加锁是为了确保shrink方法的执行过程是原子性的,避免并发问题。

判断初始化状态

shrink方法首先判断DruidDataSource的初始化状态。DruidDataSource的初始化可以采用同步初始化和异步初始化两种方式。如果采用异步初始化,则需要判断初始化是否已完成。

// 异步初始化时,等待初始化完成
if (dataSource.isInitializedAsync()) {
    while (!dataSource.isInitialized()) {
        try {
            shrinkLock.wait(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException(e);
        }
    }
}

如果采用同步初始化,则无需判断初始化状态。

回收闲置连接

判断完初始化状态后,shrink方法开始回收闲置连接。它会遍历DruidDataSource中所有连接池,依次回收闲置连接。回收过程中,会关闭连接,并从连接池中移除。

for (final DruidPooledConnection pool : this.pools) {
    // 同步回收连接池中的闲置连接
    synchronized (pool) {
        pool.shrink();
    }
}

释放数据库资源

回收完所有闲置连接后,shrink方法会释放数据库资源。它会调用底层数据库的连接池回收方法,释放数据库连接和资源。

dataSource.close();

总结

DruidDataSource的shrink过程是Druid数据源管理的重要组成部分。它通过回收闲置连接和释放数据库资源,有效提升了Druid的效率和稳定性。深入了解shrink过程的原理和实现,有助于你更好地管理和优化Druid数据源。