sql >> Databáze >  >> RDS >> Mysql

Chybějící připojení ve fondu připojení tomcat jdbc

Podívejte se na zdroj ConnectionPool.java zdá se, že jste narazili na tento fragment kódu v borrowConnection() metoda:

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

Takže podle toho je vaše připojení Null .

Hodnota con je načteno na řádku:

PooledConnection con = idle.poll();

pokud sledujete kód, uvidíte idle je (v závislosti na vaší konfiguraci, ale ve výchozím nastavení) FairBlockingQueue . Tipy si můžete prohlédnout v implementaci.

Obecně musíte vždy zavřít ResultSets, Statements a Connections a použitá připojení by měla být správně uvolněna zpět do fondu. Pokud tak neučiníte správně, může to mít za následek, že spojení nebudou nikdy uzavřena => již nikdy nebudou znovu dostupná pro opětovné použití (fond připojení „netěsní“ ).

Navrhuji, abyste vytvořili nějaké podrobné protokolování stavu fondu a sledovali jej, abyste problém izolovali.

Některé pokyny od Apache pro předcházení únikům fondu připojení k databázi:

removeAbandoned="true"

opuštěná databázová připojení jsou odstraněna a recyklována

removeAbandonedTimeout="60"

nastavte počet sekund, po které bylo připojení k databázi nečinné, než je považováno za přerušené

logAbandoned="true"

zaprotokolovat trasování zásobníku kódu, který opustil zdroje připojení k databázi. Mějte na paměti, že "protokolování opuštěných připojení zvyšuje režii pro každou výpůjčku připojení, protože je třeba vygenerovat trasování zásobníku."

Stále si myslím, že mírně zvýším maxWait hodnota (1200, 1500, 1700 – jen experimentujte, v době odezvy z pohledu uživatele nebude žádný rozdíl) vymaže ty vzácné případy, ve kterých máte stále problémy.



  1. Importujte výpis SQL do databáze PostgreSQL

  2. Výkon MySQL:více tabulek vs. index na jedné tabulce a oddílech

  3. Pochopení vstupního výstupního systému Hadoop

  4. Příklady FLOOR() v SQL Server