さまざまな理由で、プール内の接続が無効になる可能性があります:サーバー接続タイムアウト、ネットワークの問題...
私の理解では、Tomcat JDBC接続プールは、アプリケーションに提供する接続の有効性については保証しません。
プールから無効な接続が取得されるのを防ぐ(実際にはリスクを下げるだけ)ための解決策は、接続検証の構成のようです。接続の検証とは、データベースに対して非常に基本的なクエリを実行することです(例:SELECT 1;
MySQLで)。
Tomcat JDBC接続プールには、接続をテストするためのいくつかのオプションがあります。私がおもしろいと思う2つは、testOnBorrow
とtestWhileIdle
です。
最初に、testOnBorrow
が最適なオプションであると考えていました。これは、接続をアプリケーションに提供する前に基本的に検証するためです(validationInterval
で定義される最大頻度)。
しかし、すぐに接続を使用する直前に接続をテストすると、アプリケーションの応答性に影響する可能性があることに気付きました。ですから、testWhileIdle
を使用すると、接続が使用されていないときに接続をテストするため、より効率的になる可能性があります。
どのオプションを選択しても、無効な接続を取得することによるリスクは低下するだけのようですが、このリスクは依然として存在します。
だから、私は尋ねることになります:testOnBorrow
またはtestWhileIdle
または両方の組み合わせを使用する必要がありますか?
ちなみに、validationInterval
がtestOnReturn
に適用されず、testOnConnect
の目的が本当に得られないことに驚いています。
これに対する100%の正解はありません。それはトレードオフとコンテキストの問題です。
しかし、これをコーナーケースと見なすと、testOnBorrowはかなり良い保証を与えます。
これとのトレードオフは、接続を要求するたびに、データベースサーバーに対してクエリが(どんなに軽量であっても)行われることです。これはおそらく非常に高速ですが、コストはまだゼロではありません。
データベース接続の信頼性が非常に高いビジーなアプリケーションがある場合は、データから、「プールからのすべての接続要求の有効性チェック」のコストが接続の問題を検出する利点を上回ることがわかります。 。
それを最大限に活用して、使用する前に良好な接続を確保します。特に、失敗したDB操作から「簡単に回復できない」というコスト(再試行+手動介入+ワークフローの損失など)を考慮してください。
testOnIdleオプションがある場合を想像してください。これには、健全性チェックを行う前に、接続がアイドル状態になる(接続のアイドルタイムアウトに依存する)必要があります。
最後のデータポイントの1つは、一部のアプリケーションでは、クリティカルパスが「検証クエリ」時間ではないことです(できればミリ秒単位で)。アプリケーションには、対処すべき大きな問題があります。そしてもちろん、一部のアプリケーションでは、その時間が非常に重要です。
お知らせするために、これをテストしました。testOnBorrow
プロパティとtestOnIdle
プロパティの両方を使用することができます。
ただし、上記のように、アプリケーションが混雑しておらず、接続を保持する前に接続を検証できるため、testOnBorrow
を一意に選択します。
コメントで指摘したように、testOnBorrow
は検証クエリを必要としません。保持することを選択した場合は、単純な選択にすることができます。
jdbc.Hive.testOnBorrow=true
jdbc.Hive.validationQuery=SELECT 1
testWhileIdle
を使用する場合は、次を使用できます。
jdbc.testWhileIdle=true
jdbc.minEvictableIdleTimeMillis=1800000
jdbc.timeBetweenEvictionRunsMillis=1800000`
DBCPの詳細: https://commons.Apache.org/proper/commons-dbcp/configuration.html