
Procurando conselhos - li os outros dois tópicos sobre isso
no meu arquivo server.xml, tenho dois locais onde maxThreads são definidos em dois locais:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>
E
<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" />
O erro que frequentemente encontramos em nosso servidor é: "Timeout: Pool vazio. Não foi possível buscar uma conexão em 30 segundos, nenhuma disponível [tamanho: 100; ocupado: 100; ocioso: 0; último espera: 30000]" antes de um erro fatal desligamento do sistema (a máquina é reinicializada e reiniciada - em um cluster AWS ECS)
Quando aumento o valor de maxThreads para 300 na segunda instância listada aqui, recebemos a mesma mensagem de erro - portanto, não tenho certeza se o tamanho da conexão aumentou. O comportamento do sistema é diferente (a máquina não reinicia), mas os usuários não conseguem se conectar - eventualmente, é necessário reiniciar manualmente.
Como posso conseguir mais conexões com o sistema ou manter a conectividade o mais alta possível?
Em outras postagens sobre este tópico, alguns sugerem que diminuir maxThreads também (assumindo que eles sejam concluídos rapidamente) poderia proporcionar melhor desempenho.
ATUALIZAR:
no meu arquivo de propriedades do aplicativo eu tinha as seguintes configurações:
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
Responder1
Seu aplicativo sofre com o esgotamento do pool de conexões de banco de dados: como você tem mais threads em funcionamento no Tomcat (100) do que conexões disponíveis no pool de conexões (60), muitos threads precisam esperar até que uma conexão esteja disponível. Você deve ter pelo menos tantas conexões com o banco de dados quanto threads em funcionamento. Experimente com:
spring.datasource.tomcat.max-active=200
Observação: Como o seu <Connector>
não possui um executor
atributo, o <Executor>
que você criou não é usado e pode ser excluído (a menos que outro conector o utilize).
Como não há spring.jpa.hibernate.connection.provider_class
propriedade, o pool de conexões C3P0 que você tenta configurar nunca é criado: o Hibernate usará aquele configurado através das spring.datasource.*
propriedades. Portanto, você pode remover as propriedades relacionadas ao C3P0.