sql >> Database teknologi >  >> RDS >> Mysql

Manglende forbindelser i tomcat jdbc forbindelsespulje

Tag et kig på kilden til ConnectionPool.java du ser ud til at ramme dette kodestykke i borrowConnection() metode:

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

Så ifølge dette er din forbindelse Nul .

Værdien af ​​con hentes på linjen:

PooledConnection con = idle.poll();

hvis du sporer koden, vil du se idle er (afhængigt af din konfiguration, men som standard) FairBlockingQueue . Du kan tjekke implementeringen for at få tip.

Generelt skal du altid lukke ResultSets, Statements og Connections, og brugte forbindelser skal frigives korrekt tilbage til poolen. Hvis du ikke gør det korrekt, kan det resultere i, at forbindelser aldrig er blevet lukket => aldrig er tilgængelige igen til genbrug (forbindelsespuljen "lækker" ).

Jeg foreslår, at du konstruerer en detaljeret logning over poolens tilstand og overvåger den for at isolere problemet.

Nogle retningslinjer fra Apache til at forhindre databaseforbindelsespuljelækager:

removeAbandoned="true"

forladte databaseforbindelser fjernes og genbruges

removeAbandonedTimeout="60"

indstille antallet af sekunder, en databaseforbindelse har været inaktiv, før den anses for at være opgivet

logAbandoned="true"

log et stakspor af koden, der forlod databaseforbindelsesressourcerne. Husk, at "logning af forladte forbindelser tilføjer overhead for hvert forbindelseslån, fordi der skal genereres en staksporing."

Jeg tror stadig, at maxWait øges lidt værdi (1200, 1500, 1700 - bare eksperimenter, der vil ikke være nogen forskel i responstider fra brugerperspektiv) vil rydde de sjældne tilfælde, hvor du stadig har problemer.



  1. Få antallet af berørte rækker i en MySQL-opdateringserklæring?

  2. Hvad er InnoDB og MyISAM i MySQL?

  3. Fix:"BACKUP LOG kan ikke udføres, fordi der ikke er nogen aktuel database backup." i SQL Server/SQL Edge

  4. Hvordan finder jeg relationer mellem tabeller, der er langdistancerelaterede? MySQL