Количество соединений с базой данных больше, чем установлено 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 не превышена.