チェックアウトでの接続のテストがパフォーマンス上の問題であるかどうかは、テストの効率性と、チェックアウト時のConnectionの処理量によって大きく異なります。あなたが言うように、接続テストを設定する最も安全で簡単な方法は、チェックアウト時にテストすることです。しかし、それはまた、クライアントがテストの待ち時間を経験しなければならないことを意味します。
がクライアントコードパスの外部にあるように非同期でテストする場合は、チェックイン時に接続をテストし、接続がチェックインされている間は定期的に接続をテストします。プール内のアイドル状態の接続は無効である可能性は非常に低いので、テストせずに安全にチェックアウトすることができます。 (もちろん「安全」はもちろん問題ではありません。テスト・オン・チェックアウトでも、テストと最初のクライアントの使用の間にConnectionが無効になることがあります)。
Connectionチェックイン時にクライアントが使用したため有効です。まず第一に、クライアントがExceptionを経験するという事実が、Connectionが無効であることをプールに通知するとは限りません。たとえば、Connection.commit()
への呼び出しは、Connectionが完全に有効であっても、トランザクションの行を同時に変更すると失敗する可能性があります。基本的に、コネクションがチェックアウトされたときの例外は、クライアントのビジネスでありプールのものではありません。 c3p0(私は珍しいと思います)は、クライアントが経験した例外の通知を行い、プールがConnectionの有効性について理由を判断できるように静かなConnectionテストを開始します。しかし、クライアントが有効なConnectionからExceptionsを経験する理由はたくさんあります。
第2に、プールは、クライアントが最後に使用したConnectionのプロンプトチェックインに依存することはできません。これは悪い考えですが、クライアントは実際のデータベース作業よりもずっと長い時間コネクションを開いています。 lasクライアントの使用とチェックインの間の時間ウィンドウは明らかにConnectionが悪くなる可能性のあるウィンドウです。
したがって、非同期接続テスト(十分なサイズのプールの場合)がクライアントの待ち時間に影響を与えない接続テストを行う場合は、接続がプールされている間にテスト時にテストして頻繁にテストしたいアイドル。
実際には、JDBCドライバはConnection.isValid()
で高速で信頼性の高いテストを提供するため、非同期接続テストの必要性は減少しています。DBMSに依存しない信頼性の高い接続テストを定義するために、c3p0はデータベースメタデータに対して頻繁に非常に遅いクエリをデフォルトにしなければなりませんでした。このテストの待ち時間は、クライアントのパフォーマンスに大きな影響を与える可能性があります。 Connection.isValid()
(または効率的なpreferredTestQuery
)を使用すると、テストでは、チェックアウト時のテストの単純性と堅牢性が、小規模なクライアントのレイテンシよりも優れているほど十分高速であることがよくあります。パフォーマンス上の理由から非同期接続テストの使用をアドバイスするために使用されるc3p0ドキュメント。 current documentationは、同期テスト・オン・チェックアウトを最初に推奨します。テスト待ち時間がパフォーマンスに影響を与える場合、潜在的な最適化として非同期テストにバックオフするだけです。ほとんどの場合、実際には、現在は通常testConnectionsOnCheckout
を使用して終了します。
あなたがチェックアウトしたときに接続が有効かどうかは、唯一の関心事であるため、とにかく時間の無駄です。 **これはテストする時間です**。唯一可能なメリットは、古い接続をプールすることではなく、クライアントでのスペース節約である可能性がありますが、クライアントで有効であるとテストされていない場合は、すでに終了している必要があります。 – EJP
@EJPあなたは私の前提に同意しますか?これは確かに時間の無駄です。 –
私が書いたことについて不明な点はありますか? – EJP