
Ich suche Rat - ich habe die anderen beiden Threads dazu gelesen
in meiner Datei server.xml gibt es zwei Stellen, an denen maxThreads an zwei Stellen definiert sind:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>
UND
<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" />
Der Fehler, der bei unserem Server häufig auftritt, ist: „Timeout: Pool leer. Verbindung kann innerhalb von 30 Sekunden nicht hergestellt werden, keine verfügbar [size:100;busy:100;idle:0;lastwait:30000]“ vor einem schwerwiegenden Herunterfahren des Systems (die Maschine wird zurückgesetzt und neu gestartet – auf einem AWS ECS-Cluster).
Wenn ich im zweiten hier aufgeführten Fall den maxThreads-Wert auf 300 erhöhe, erhalten wir dieselbe Fehlermeldung. Ich bin mir also nicht sicher, ob die Verbindungsgröße überhaupt zugenommen hat. Das Systemverhalten ist anders (die Maschine startet nicht neu), aber dann können Benutzer keine Verbindung herstellen. Eventuell muss sie manuell neu gestartet werden.
Wie kann ich mehr Verbindungen zum System herstellen oder die Konnektivität so hoch wie möglich halten?
In anderen Beiträgen zu diesem Thema schlagen einige vor, dass auch eine Verringerung der maxThreads (vorausgesetzt, sie werden schnell abgeschlossen) zu einer besseren Leistung führen könnte.
AKTUALISIEREN:
in meiner Anwendungseigenschaftendatei hatte ich die folgenden Einstellungen:
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
Antwort1
Ihre Anwendung leidet unter einer Erschöpfung des Datenbankverbindungspools: Da Sie in Tomcat mehr Arbeitsthreads (100) als verfügbare Verbindungen im Verbindungspool (60) haben, müssen viele Threads warten, bis eine Verbindung verfügbar ist. Sie sollten mindestens so viele Verbindungen zur Datenbank haben wie Arbeitsthreads. Versuchen Sie es mit:
spring.datasource.tomcat.max-active=200
Anmerkung: Da Ihr <Connector>
kein executor
Attribut hat, <Executor>
wird das von Ihnen erstellte nicht verwendet und kann gelöscht werden (es sei denn, es wird von einem anderen Connector verwendet).
Da es keine spring.jpa.hibernate.connection.provider_class
Eigenschaft gibt, wird der C3P0-Verbindungspool, den Sie zu konfigurieren versuchen, nie erstellt: Hibernate verwendet den über die spring.datasource.*
Eigenschaften konfigurierten Pool. Sie können daher die C3P0-bezogenen Eigenschaften entfernen.