maxConnections o maxThreads en Tomcat

maxConnections o maxThreads en Tomcat

Buscando consejo. He leído los otros dos hilos sobre esto.

en mi archivo server.xml tengo dos lugares donde maxThreads se definen en dos lugares:

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

Y

  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" />

El error con el que nos encontramos con frecuencia en nuestro servidor es: "Tiempo de espera: grupo vacío. No se puede recuperar una conexión en 30 segundos, ninguna disponible [tamaño:100;ocupado:100;idle:0;lastwait:30000]" antes de un error fatal apagado del sistema (la máquina se reinicia y se inicia nuevamente, en un clúster de AWS ECS)

Cuando aumento el valor de maxThreads a 300 en la segunda instancia enumerada aquí, recibimos el mismo mensaje de error, por lo que no estoy seguro de si el tamaño de la conexión ha aumentado en absoluto. El comportamiento del sistema es diferente (la máquina no se reinicia), pero luego los usuarios no pueden conectarse; eventualmente es necesario reiniciar manualmente.

¿Cómo puedo lograr más conexiones al sistema o mantener la conectividad lo más alta posible?

En otras publicaciones sobre este tema, algunos sugieren que disminuir también maxThreads (suponiendo que se completen rápidamente) podría brindar un mejor rendimiento.

ACTUALIZAR:

en mi archivo de propiedades de la aplicación tenía la siguiente configuración:

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

Respuesta1

Su aplicación sufre un agotamiento del grupo de conexiones de la base de datos: dado que tiene más subprocesos de trabajo en Tomcat (100) que conexiones disponibles en el grupo de conexiones (60), muchos subprocesos deben esperar a que haya una conexión disponible. Debe tener al menos tantas conexiones a la base de datos como subprocesos de trabajo. Prueba con:

spring.datasource.tomcat.max-active=200

Observación: Como su <Connector>no tiene un executoratributo, el <Executor>que creó no se usa y se puede eliminar (a menos que otro conector lo use).

Como no hay ninguna spring.jpa.hibernate.connection.provider_classpropiedad, el grupo de conexiones C3P0 que intenta configurar nunca se crea: Hibernate usará el configurado a través de las spring.datasource.*propiedades. Por lo tanto, puede eliminar las propiedades relacionadas con C3P0.

información relacionada