maxConnections или maxThreads на tomcat

maxConnections или maxThreads на tomcat

Нужен совет - я прочитал две другие темы по этому поводу

В моем файле server.xml есть два места, где maxThreads определены:

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>

И

  1. <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="100" SSLEnabled="true" scheme="https" secure="true" connectionTimeout="600000" keystoreFile="/usr/local/tomcat/conf/keystore.p12" keystorePass="mypassword" clientAuth="false" sslProtocol="TLS" />

Ошибка, с которой мы часто сталкиваемся на нашем сервере: «Время ожидания истекло: пул пуст. Невозможно получить соединение в течение 30 секунд, нет доступных [размер:100;занят:100;бездействие:0;lastwait:30000]» перед фатальным завершением работы системы (машина перезагружается и запускается снова — в кластере AWS ECS)

Когда я увеличиваю значение maxThreads до 300 во втором экземпляре, указанном здесь, мы получаем то же самое сообщение об ошибке - поэтому я не уверен, увеличился ли размер соединения вообще. Поведение системы отличается (машина не перезагружается), но затем пользователи не могут подключиться - в конечном итоге требуется ручной перезапуск.

Как можно увеличить количество подключений к системе или поддерживать уровень подключенности на максимально высоком уровне?

В других сообщениях на эту тему некоторые предлагают также уменьшить maxThreads (при условии, что они быстро завершатся), что может повысить производительность.

ОБНОВЛЯТЬ:

В моем файле свойств приложения были следующие настройки:

spring.datasource.url=jdbc:postgresql://db####
spring.datasource.username=#####
spring.datasource.password=######
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=60
spring.datasource.tomcat.test-on-borrow=true

spring.jpa.show-sql=false
#spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.connection.provider_class=org.hibernate.c3p0.internal.C3P0ConnectionProvider
spring.jpa.properties.hibernate.c3p0.min_size=1
spring.jpa.properties.hibernate.c3p0.max_size=30
spring.jpa.properties.hibernate.c3p0.timeout=120
spring.jpa.properties.hibernate.c3p0.max_statements=20

решение1

Ваше приложение страдает от истощения пула подключений к базе данных: поскольку у вас больше рабочих потоков в Tomcat (100), чем доступных подключений в пуле подключений (60), многим потокам приходится ждать, пока подключение станет доступным. У вас должно быть как минимум столько же подключений к базе данных, сколько у вас рабочих потоков. Попробуйте:

spring.datasource.tomcat.max-active=200

Замечание: Поскольку у вас <Connector>нет атрибута executor, <Executor>созданный вами коннектор не используется и может быть удален (если его не использует другой коннектор).

Поскольку свойства отсутствуют spring.jpa.hibernate.connection.provider_class, пул соединений C3P0, который вы пытаетесь настроить, никогда не создается: Hibernate будет использовать тот, который настроен через spring.datasource.*свойства. Поэтому вы можете удалить свойства, связанные с C3P0.

Связанный контент