tomcat の maxConnections または maxThreads

tomcat の maxConnections または maxThreads

アドバイスを求めています - これに関する他の2つのスレッドを読みました

私の server.xml ファイルには、maxThreads が定義されている場所が 2 か所あります。

  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 秒以内に接続を取得できません。利用可能な接続がありません [size:100;busy:100;idle:0;lastwait:30000]」で、その後、システムが致命的にシャットダウンします (マシンがリセットされ、AWS ECS クラスター上で再起動します)。

ここでリストされている 2 番目のインスタンスで 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 関連のプロパティを削除できます。

関連情報