文章目录
前言
Connection使用完成之后,执行关闭方法后,连接资源重新回到资源池中,资源利用
一、DruidPooledConnection#close
public void close() throws SQLException {
if (this.disable) {
return;
}
// 获取到 DruidPooledConnection 中的 DruidConnectionHolder
DruidConnectionHolder holder = this.holder;
if (holder == null) {
if (dupCloseLogEnable) {
LOG.error("dup close");
}
return;
}
// 获取到 DruidConnectionHolder 中的 DruidAbstractDataSource
DruidAbstractDataSource dataSource = holder.getDataSource();
// 判断创建连接的线程是否和当前线程是同一个线程,(存在销毁资源的异步线程)
boolean isSameThread = this.getOwnerThread() == Thread.currentThread();
if (!isSameThread) {
dataSource.setAsyncCloseConnectionEnable(true);
}
if (dataSource.isAsyncCloseConnectionEnable()) {
syncClose(); // 如果来自异步线程
return;
}
if (!CLOSING_UPDATER.compareAndSet(this, 0, 1)) {
return;
}
try {
for (ConnectionEventListener listener : holder.getConnectionEventListeners()) {
listener.connectionClosed(new ConnectionEvent(this));
}
List<Filter> filters = dataSource.getProxyFilters();
if (filters.size() > 0) {
FilterChainImpl filterChain = new FilterChainImpl(dataSource);
filterChain.dataSource_recycle(this);
} else {
recycle();
}
} finally {
CLOSING_UPDATER.set(this, 0);
}
this.disable = true;
}
二、DruidPooledConnection#recycle
public void recycle() throws SQLException {
if (this.disable) {
return;
}
DruidConnectionHolder holder = this.holder;
if (holder == null) {
if (dupCloseLogEnable) {
LOG.error("dup close");
}
return;
}
if (!this.abandoned) {
// 如果这个资源还要用的话,进行资源回收
DruidAbstractDataSource dataSource = holder.getDataSource();
dataSource.recycle(this);
}
this.holder = null;
conn