sql >> Base de Datos >  >> RDS >> Mysql

Faltan conexiones en el grupo de conexiones tomcat jdbc

Echando un vistazo a la fuente de ConexiónGrupo.java parece que golpeas este fragmento de código en borrowConnection() método:

        //we didn't get a connection, lets see if we timed out
        if (con == null) {
            if ((System.currentTimeMillis() - now) >= maxWait) {
                throw new SQLException("[" + Thread.currentThread().getName()+"] " +
                    "Timeout: Pool empty. Unable to fetch a connection in " + (maxWait / 1000) +
                    " seconds, none available["+busy.size()+" in use].");
            } else {
                //no timeout, lets try again
                continue;
            }
        }

De acuerdo con esto, su conexión es Null .

El valor de con se recupera en la línea:

PooledConnection con = idle.poll();

si rastrea el código, verá idle es (dependiendo de su configuración, pero por defecto) FairBlockingQueue . Puede revisar la implementación para obtener sugerencias.

En general, siempre tiene que cerrar ResultSets, declaraciones y conexiones, y las conexiones usadas deben devolverse correctamente al grupo. Si no lo hace correctamente, es posible que las conexiones nunca se cierren => nunca vuelvan a estar disponibles para su reutilización (grupo de conexiones "fugas" ).

Le sugiero que construya un registro detallado sobre el estado del grupo y lo supervise para aislar el problema.

Algunas pautas de Apache para evitar fugas en el grupo de conexiones de la base de datos:

removeAbandoned="true"

las conexiones de bases de datos abandonadas se eliminan y reciclan

removeAbandonedTimeout="60"

establece el número de segundos que una conexión a la base de datos ha estado inactiva antes de que se considere abandonada

logAbandoned="true"

registre un seguimiento de pila del código que abandonó los recursos de conexión de la base de datos. Tenga en cuenta que "el registro de conexiones abandonadas agrega una sobrecarga para cada conexión prestada porque se debe generar un seguimiento de la pila".

Sigo pensando en aumentar ligeramente el maxWait valor (1200, 1500, 1700 - solo experimente, no habrá diferencia en los tiempos de respuesta desde la perspectiva del usuario) aclarará esos casos raros, en los que todavía tiene problemas.