Mysql
 sql >> база данни >  >> RDS >> Mysql

Липсващи връзки в tomcat jdbc пул за връзки

Разглеждане на източника на ConnectionPool.java изглежда удряте този кодов фрагмент в borrowConnection() метод:

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

Така че според това връзката ви е Null .

Стойността на con се извлича на реда:

PooledConnection con = idle.poll();

ако проследите кода, ще видите idle е (в зависимост от конфигурацията ви, но по подразбиране) FairBlockingQueue . Можете да проверите реализацията за съвети.

По принцип винаги трябва да затваряте ResultSets, Statements и Connections и използваните връзки трябва да бъдат правилно освободени обратно в пула. Ако не направите това правилно, връзките никога не са били затворени => никога повече да не бъдат налични за повторна употреба (пул за връзки „изтича“ ).

Предлагам ви да създадете малко подробно регистриране на състоянието на пула и да го наблюдавате, за да изолирате проблема.

Някои насоки от Apache за предотвратяване на течове на пула за връзки с база данни:

removeAbandoned="true"

изоставените връзки към базата данни се премахват и рециклират

removeAbandonedTimeout="60"

задайте броя секунди, през които връзката към базата данни е била неактивна, преди да се счита за изоставена

logAbandoned="true"

регистрирайте стекова проследяване на кода, който е изоставил ресурсите за връзка с базата данни. Имайте предвид, че „регистрирането на изоставени връзки добавя допълнителни разходи за всяко заемане на връзка, защото трябва да се генерира трасиране на стека.“

Все още мисля, че леко увеличавам maxWait стойност (1200, 1500, 1700 - просто експериментирайте, няма да има разлика във времето за реакция от гледна точка на потребителя) ще изчисти онези редки случаи, в които все още имате проблеми.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвате външни ключове с PHP

  2. Git bash на Windows 7. Командата mysqldump не работи

  3. MySQL:Как да вмъкна запис за всеки резултат в SQL заявка?

  4. Търсите неща в близост до геолокация?

  5. Как да прехвърлите всички MySQL бази данни от стар към нов сървър