Количество соединений с базой данных больше, чем установлено DBCP maxTotal - PullRequest
2 голосов
/ 25 марта 2019

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

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

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

Соответственно, я настроил следующий элемент 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 Ответ

0 голосов
/ 15 апреля 2019

Может ли быть так, что атрибут 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 не превышена .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...