Mysql
 sql >> Base de données >  >> RDS >> Mysql

Connexions manquantes dans le pool de connexions tomcat jdbc

Jetez un œil à la source de ConnectionPool.java vous semblez frapper cet extrait de code dans le borrowConnection() méthode :

        //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;
            }
        }

Donc d'après ceci, votre connexion est Null .

La valeur de con est récupéré sur la ligne :

PooledConnection con = idle.poll();

si vous suivez le code, vous verrez idle est (selon votre configuration, mais par défaut) FairBlockingQueue . Vous pouvez consulter l'implémentation pour obtenir des conseils.

En général, vous devez toujours fermer les ResultSets, les déclarations et les connexions et les connexions utilisées doivent être correctement libérées dans le pool. Si vous ne le faites pas correctement, les connexions ne seront jamais fermées => ne seront plus jamais disponibles pour être réutilisées (pool de connexions "fuites" ).

Je vous suggère de construire une journalisation détaillée sur l'état du pool et de la surveiller pour isoler le problème.

Quelques directives d'Apache pour empêcher les fuites de pool de connexion à la base de données :

removeAbandoned="true"

les connexions de base de données abandonnées sont supprimées et recyclées

removeAbandonedTimeout="60"

définir le nombre de secondes pendant lesquelles une connexion à la base de données a été inactive avant d'être considérée comme abandonnée

logAbandoned="true"

enregistre une trace de pile du code qui a abandonné les ressources de connexion à la base de données. Gardez à l'esprit que "la journalisation des connexions abandonnées ajoute une surcharge pour chaque emprunt de connexion car une trace de pile doit être générée."

Je pense toujours augmenter légèrement le maxWait (1 200, 1 500, 1 700 - expérimentez, il n'y aura pas de différence dans les temps de réponse du point de vue de l'utilisateur) effacera les rares cas où vous rencontrez encore des problèmes.