Puncte:1

maxConnections sau maxThreads pe tomcat

drapel tk

Caut un sfat - am citit celelalte două fire despre asta

în fișierul meu server.xml am două locuri unde maxThreads sunt definite în două locuri:

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

ȘI

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

Eroarea cu care ne confruntăm frecvent cu serverul nostru este: „Timeout: Pool empty. Imposibil de preluat o conexiune în 30 de secunde, nu este disponibilă [size:100;busy:100;idle:0;lastwait:30000]” înainte de o oprire fatală a sistemului (mașina resetează și pornește din nou - pe un cluster AWS ECS)

Când cresc valoarea maxThreads la 300 în a doua instanță listată aici, primim același mesaj de eroare - așa că nu sunt sigur dacă dimensiunea conexiunii a crescut deloc. Comportamentul sistemului este diferit (mașina nu repornește), dar atunci utilizatorii nu se pot conecta - în cele din urmă necesită repornire manuală.

Cum pot realiza mai multe conexiuni la sistem sau pot menține conectivitatea cât mai ridicată?

În alte postări despre acest subiect, unii sugerează că și scăderea maxThreads (presupunând că se completează rapid) ar putea oferi performanțe mai bune.

ACTUALIZAȚI:

în fișierul meu de proprietăți ale aplicației aveam următoarele setări:

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=fals
#spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=validare
spring.jpa.properties.hibernate.show_sql=fals
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
Piotr P. Karwasz avatar
drapel by
Aceste mesaje nu sunt trimise de pool-ul de fire de lucru Tomcat, ci de pool-ul de conexiuni la baza de date. Puteți adăuga configurația pool-ului dvs. de conexiuni DB?
RebRy avatar
drapel tk
Mulțumesc pentru răspunsul tău Piotr - în baza mea de date am verificat fișierul de configurare (postgres) și maxConnections este setat la 500. Sunt setările definite pe partea serverului postgres?
Piotr P. Karwasz avatar
drapel by
Aplicația dvs. utilizează probabil un pool de conexiuni (Tomcat JDBC, DBCP2, HikariCP pentru a numi câteva posibilități). Fiecare dintre ele este configurat într-un mod diferit. Prin [googlarea mesajului dvs. de eroare](https://www.google.com/search?q=size%3A100%3Bbusy%3A100%3Bidle%3A0%3Blastwait%3A30000) se poate ghici că utilizați Tomcat JDBC. Urmați [documentația](https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html) pentru a crește `maxActive` (în mod implicit 100).
RebRy avatar
drapel tk
Da - folosind Tomcat JDBC - deoarece sunt nou în acest domeniu, nu mi-am putut da seama unde altundeva să caut aceste setări. Acest lucru a ajutat enorm - mulțumesc pentru postarea link-urilor!
Piotr P. Karwasz avatar
drapel by
BTW: dacă aveți 100 de fire de lucru și 100 de conexiuni de baze de date în pool, aplicația dvs. ar putea avea scurgeri de conexiuni (adică să nu le returneze la pool). Puteți încerca să utilizați proprietățile `logAbandoned` și `removeAbandoned` ale pool-ului pentru a le găsi.
RebRy avatar
drapel tk
Am actualizat aici arătând proprietățile aplicației (care cred că definesc/prestabilit valorile pe care le primesc în eroare). Încă nu am avut ocazia să testez în producție.
Puncte:1
drapel by

Aplicația dumneavoastră suferă de epuizarea pool-ului de conexiuni la baza de date: deoarece aveți mai multe fire de execuție în Tomcat (100) decât conexiuni disponibile în pool-ul de conexiuni (60), multe fire de execuție trebuie să aștepte ca o conexiune să fie disponibilă. Ar trebui să aveți cel puțin atât de multe conexiuni la baza de date câte fire de lucru aveți. Încearcă cu:

spring.datasource.tomcat.max-active=200

Observație: Din moment ce dvs <Connector> nu are un executor testamentar atributul, cel <Executor> pe care l-ați creat nu este folosit și poate fi șters (cu excepția cazului în care îl folosește un alt conector).

Din moment ce nu există spring.jpa.hibernate.connection.provider_class proprietatea, pool-ul de conexiuni C3P0 pe care încercați să îl configurați nu este niciodată creat: Hibernate îl va folosi pe cel configurat prin spring.datasource.* proprietăți. Prin urmare, puteți elimina proprietățile legate de C3P0.

RebRy avatar
drapel tk
Din păcate - cu aceste modificări, serviciul a avut încă aceeași eroare „Timeout: Pool empty. Imposibil de preluat o conexiune în 30 de secunde, niciuna disponibilă[size:100; busy:100; idle:0; lasttwait:30000]”. (Am adăugat maxConnections=300 la
Piotr P. Karwasz avatar
drapel by
Deoarece pool-ul de conexiuni nu pare să se schimbe după o reconfigurare, poate că aplicația dvs. nu folosește pool-ul de conexiuni al lui Spring, ci altul. Verificați dacă nu aveți un `` definiția tipului `javax.sql.DataSource` în folderul dvs. Tomcat `conf` (poate fi în multe fișiere diferite).
RebRy avatar
drapel tk
Mă uit din nou la această problemă (deoarece am reușit să trăim cu ea) și revin posibilitatea de a ajusta setările noastre și am ratat un detaliu din observația dvs. -- Am văzut un cod comentat în server.xml: . decomentarea acestor linii ar folosi executorul definit mai devreme în fișierul server.xml? Există o modalitate de a ecou/printa/înregistra acest tip de proprietăți/configurații în jurnalul de pornire java/tomcat?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.