Количество соединений с базой данных больше, чем установлено DBCP maxTotal

Я использую веб-приложение на Java с использованием Tomcat (версия 8.0.43).

Я переместил tomcat-dbcp.jar (который шел с Tomcat8.0.43) в jdk/jre/lib/ext так что это доступно для JRE.

Я думаю, что я использую DBCP Tomcat (в отличие от DBCP Apache Commons), но, как я понимаю из документации, параметры конфигурации такие же, как для DBCP Apache Commons, которые подробно описаны здесь.

Соответственно я настроил следующее Resource элемент для пула соединений в context.xml:

<Resource 
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container" 
driverClassName="com.mysql.jdbc.Driver"  
logAbandoned="false" 
maxTotal="100" 
maxIdle="30" 
maxWaitMillis="10000" 
name="jdbc/[dbName]" 
password="${dbPassword}" 
removeAbandonedOnBorrow="true" 
removeAbandonedTimeout="60" 
type="javax.sql.DataSource" 
url="[dbUrl]autoReconnect=true" 
username="${dbUsername}" 
testWhileIdle="true" 
testOnBorrow="true" 
validationQuery="SELECT 1 AS dbcp_connection_test"/>

В последнее время я получаю сообщение об ошибке в моих журналах:

MySQLNonTransientConnectionException: слишком много соединений

Поэтому я проверил, сколько подключений у меня на момент ошибки (через Amazon CloudWatch для RDS. В частности, "ConnectionCount"), и оно может достигать 150 подключений. Как это возможно, если я установил свой maxTotal подключения до 100?

Я запускаю свое приложение в нескольких экземплярах. Может ли быть так, что maxTotal Атрибут применяется к каждому экземпляру (например: если у меня есть Пул подключений, определенный для 2 экземпляров, то мой maxTotal = 100 + 100 = 200?)

Это как если бы атрибуты, которые я установил в Resource элемент игнорируется. Может быть, что-то не так с моей настройкой? Я не использую Tomcat DBCP, как я предполагал?

Кроме того, если я посмотрю дальше вниз по StackTrack Exception что я цитировал выше, я вижу, что

org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection

называется. Я не уверен, означает ли это, что я использую другой пул подключений (DBCP2) из того, который я предположил, я использую (Tomcat DBCP).

1 ответ

Может ли быть так, что атрибут maxTotal применяется к каждому экземпляру (например: если у меня есть Пул соединений, определенный для 2 экземпляров, тогда мой maxTotal = 100 + 100 = 200?)

Это правильно, так как вы определили <Resource> внутри context.xml файл.
Добавьте свой ресурс внутри server.xml сделать его доступным для всех контекстов и убедитесь, что вы удалили его из всех файлов context.xml. Запишите global атрибут отсутствует в вашей конфигурации

<GlobalNamingResources>
    <Resource
        global="jdbc/[dbName]"

        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        auth="Container" 
        driverClassName="com.mysql.jdbc.Driver"  
        logAbandoned="false" 
        maxTotal="100" 
        maxIdle="30" 
        maxWaitMillis="10000" 
        name="jdbc/[dbName]" 
        password="${dbPassword}" 
        removeAbandonedOnBorrow="true" 
        removeAbandonedTimeout="60" 
        type="javax.sql.DataSource" 
        url="[dbUrl]autoReconnect=true" 
        username="${dbUsername}" 
        testWhileIdle="true" 
        testOnBorrow="true" 
        validationQuery="SELECT 1 AS dbcp_connection_test"/>
</GlobalNamingResources>

Чтобы следить за:

  • testOnBorrow="true" приводит к снижению производительности, что не всегда того стоит.

  • testWhileIdle="true" относится к timeBetweenEvictionRunsMillis что составляет 5 секунд по умолчанию. В некоторых случаях значение по умолчанию может быть слишком коротким.

  • Убедитесь, что квота AWS RDS не превышена.

Другие вопросы по тегам