Lectura del código fuente de Druid 8-DruidDataSource's removeAbandoned mecanismo

Este artículo ha participado en la actividad "Ceremonia de creación de recién llegados", y hemos iniciado juntos el camino de la creación de Nuggets.

Existe un mecanismo removeAbandoned para Druid, que se introdujo en el código fuente de getConnection. removeAbandoned es en realidad el mecanismo de detección de fugas de Druid. Los parámetros principales son:

parámetro ilustrar
eliminarAbandonado Si la conexión se filtra, ya sea para reciclar la conexión filtrada, el valor predeterminado es falso;
registroAbandonado Si se recicla la conexión perdida, ya sea para imprimir un registro, el valor predeterminado es falso;
removeAbandonedTimeoutMillis El tiempo de espera para el reciclaje de la conexión, el valor predeterminado es de 5 minutos;

removeAbandoned se utiliza como un interruptor para habilitar el mecanismo de detección de fugas de conexión. El valor predeterminado es falso. Cuando es verdadero, se detecta regularmente con la frecuencia de las llamadas DestroyTask. En el método de ejecución de DestroyTask:

@Override
public void run() {
    shrink(true, keepAlive);
    if (isRemoveAbandoned()) {
        removeAbandoned();
    }
}
复制代码

Cuando el mecanismo de detección de fugas de conexión está habilitado, detectará periódicamente si la conexión activa el período de tiempo de espera y, si lo hace, la conexión se cerrará. Todas las conexiones utilizadas después de get se colocan en activeConnections. Luego, recorra activeConnections, juzgue la conexión y cierre si se activa el tiempo de espera. El código fuente de removeAbandoned es el siguiente:

//定义一个abandonedList来存放符合超时时间的连接。
List<DruidPooledConnection> abandonedList = new ArrayList<DruidPooledConnection>();
//加锁
activeConnectionLock.lock();
try {
     //通过迭代器遍历activeConnections
    Iterator<DruidPooledConnection> iter = activeConnections.keySet().iterator();
	
    for (; iter.hasNext();) {
        //获取到连接
        DruidPooledConnection pooledConnection = iter.next();
		//如果连级为Running状态,说明sql语句正在执行,则跳过当前连接
        if (pooledConnection.isRunning()) {
            continue;
        }
        //计算超时时间 默认值为5分钟
        long timeMillis = (currrentNanos - pooledConnection.getConnectedTimeNano()) / (1000 * 1000);
        //如果触发超时:
        if (timeMillis >= removeAbandonedTimeoutMillis) {
			//从iter删除该连接
            iter.remove();
			//关闭setTraceEnable
            pooledConnection.setTraceEnable(false);
            //添加到abandonedList
            abandonedList.add(pooledConnection);
        }
    }
} finally {
//解锁
    activeConnectionLock.unlock();
}
复制代码

Coloque las conexiones que cumplan con la condición de tiempo de espera en la lista abandonada. Si la lista abandonada no está vacía, repite la lista abandonada y cierra las conexiones:

//定义锁
final ReentrantLock lock = pooledConnection.lock;
lock.lock();
try {
    //如果连接为disiable状态 说明已经不可用 直接跳过
    if (pooledConnection.isDisable()) {
        continue;
    }
} finally {
    //解锁
    lock.unlock();
}
//关闭连接
JdbcUtils.close(pooledConnection);
//设置abandond状态
pooledConnection.abandond();
//增加计数器
removeAbandonedCount++;
removeCount++;
复制代码

A continuación, se realiza el procesamiento de registros. Después de imprimir el registro de advertencia, se ejecuta el método.

Supongo que te gusta

Origin juejin.im/post/7078497281242038302
Recomendado
Clasificación