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

Connessioni mancanti nel pool di connessioni jdbc di Tomcat

Dando un'occhiata alla fonte di ConnectionPool.java sembra che tu abbia colpito questo frammento di codice in borrowConnection() metodo:

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

Quindi, in base a ciò, la tua connessione è Null .

Il valore di con viene recuperato sulla riga:

PooledConnection con = idle.poll();

se segui il codice, vedrai idle è (a seconda della configurazione, ma per impostazione predefinita) FairBlockingQueue . Puoi controllare l'implementazione per suggerimenti.

In generale devi sempre chiudere ResultSets, Statements e Connections e le connessioni utilizzate devono essere correttamente rilasciate nel pool. Non farlo correttamente potrebbe comportare la chiusura delle connessioni => non essere mai più disponibili per il riutilizzo (il pool di connessioni "perde" ).

Ti suggerisco di costruire una registrazione dettagliata sullo stato del pool e di monitorarlo per isolare il problema.

Alcune linee guida di Apache per prevenire perdite di pool di connessioni al database:

removeAbandoned="true"

le connessioni al database abbandonate vengono rimosse e riciclate

removeAbandonedTimeout="60"

imposta il numero di secondi in cui una connessione al database è rimasta inattiva prima che venga considerata abbandonata

logAbandoned="true"

registrare una traccia dello stack del codice che ha abbandonato le risorse di connessione al database. Tieni presente che "la registrazione delle connessioni abbandonate aggiunge un sovraccarico per ogni connessione presa in prestito perché è necessario generare una traccia dello stack".

Penso ancora di aumentare leggermente il maxWait value (1200, 1500, 1700 - prova solo, non ci saranno differenze nei tempi di risposta dal punto di vista dell'utente) cancellerà quei rari casi in cui hai ancora problemi.