すばらしい質問です。私はこの質問に苦労していました。スタックオーバーフローに関する最も一般的な答えは、事実上すべての問題に対して「状況によって異なります...」です。私はそれを言うのは嫌ですが、接続プールを微調整することほど関連性のある場所はありません。これは実際には需要と供給のゲームであり、接続要求は需要であり、供給はMySQLが利用できる接続の数です。本当に重要なのは、古い接続がプールから返されるのを防ぐことなのか、それとも、MySQLがアイドル状態の接続で過負荷にならないようにすることなのかということです。ほとんどの人はどこかで真ん中に灰汁を出します。
誰かが1つの接続プール構成を選択する理由を本当に理解している場合は、「ロケットソリッド」設定の検索をやめると信じてください。これは、ショップへのビジネスプランを探し回るようなものです。これは、取得する接続要求の数と、使用可能にする永続的な接続の数に完全に根ざしています。以下に、特定の設定を使用する理由の例を示します。 Context.xmlファイルの「Context」タグの「Resource」タグ内で変更する必要がある変数を参照します。完全な構成のサンプルは、一番下にあります。
トラフィックが少ない
この状況では、アプリケーションへのリクエストがほとんどないため、接続プール内のすべての接続が失効し、失効した接続によるアプリケーションによる最初のリクエストがエラーを引き起こす可能性が高くなります。 (使用しているMySQLドライバーによっては、エラーが原因で、最後に正常に受信されたパケットがデータベースのwait_timeout設定を超えたことが説明される場合があります)。したがって、接続プールの戦略は、接続が切断された場合に返されるのを防ぐことです。次の2つのオプションは、トラフィックの少ないサイトではほとんど副作用がありません。
-
接続を切断する前に長く待つ -これを行うには、
wait_timeout
の値を変更します MySQL構成で。 MYSQLワークベンチでは、Admnin>構成ファイル>ネットワークでその設定を簡単に見つけることができます。トラフィックの多いサイトの場合、プールが常にアイドル状態の接続でいっぱいになる可能性があるため、これはあまり推奨されません。ただし、これはトラフィックの少ないシナリオであることを忘れないでください。 -
すべての接続をテストする -これを行うには、
testOnBorrow = true
を設定します およびvalidationQuery= "SELECT 1"
。パフォーマンスはどうですか?この状況ではトラフィックが少なくなっています。プールから返されたすべての接続をテストすることは問題ではありません。つまり、単一の接続で実行しているすべてのMySQLトランザクションに追加のクエリが追加されます。トラフィックの少ないサイトでは、これは本当にあなたが心配することですか?接続が使用されていないためにプールで接続が停止するという問題が、主な焦点です。
中程度のトラフィック
- すべての接続を定期的に確認する -使用するたびにすべての接続をテストしたくない場合、または待機タイムアウトを延長したくない場合は、選択したデフォルトまたはカスタムクエリを使用してすべての接続を定期的にテストできます。たとえば、
validationQuery = "SELECT 1"
を設定します。 、testWhileIdle = "true"
、およびtimeBetweenEvictionRunsMillis = "3600"
またはあなたが望むどんな間隔でも。トラフィックが非常に少ない場合、これには絶対に多くの作業が必要になります。考えてみてください。プールに30の接続があり、1時間で4つしか呼び出されない場合は、前のtestOnBorrow
を使用して、各リクエストで4つの接続すべてを簡単に確認できます。 パフォーマンスへの影響がほとんどないアプローチ。ただし、代わりに「1時間ごとにすべてチェック」アプローチを実行する場合は、4つだけが使用されたときに、すべての接続をチェックするように30の要求を行います。
トラフィックが多い
- アイドル状態の接続をすぐに停止する -これは、wait_timeoutを延長するべきではなく、すべての接続をテストするべきではないと誰もが言っている状況です。あらゆる状況に理想的なモデルではありません。大量のトラフィックがある場合、プール内のすべての接続が利用され、実際の問題は、実際に
wait_time
の長さを短縮しながら、使用可能な接続の数を増やすことになります。 そのため、DBでアイドル状態の接続が大量に発生することはありません。これは、忙しいサイトで1日に最大10,000のアイドル接続があるため、wait_timeout ビジーサイトのwait_timeoutを下げる
サンプルContext.xml構成
<Context>
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mysql"/>
</Context>
サンプルのweb.xml構成
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Tomcatプール を微調整するためのTomcatプールのプロパティに関するドキュメント