返回
走进Druid源码:揭秘DruidDataSource的shrink过程
后端
2023-11-19 00:02:33
在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数据源。