2016-06-16 7 views
3

こんにちはこの質問は、c3p0より多くの接続プールマネージャに適用する必要がありますが、私はその例を使用します。接続プーリング - チェックイン時に接続をテストする理由

1つのオプションは、接続プール管理に提供されます。これは、接続プールにチェックインされる前に接続をテストすることです。 アプリケーションが接続を使用した後でこれは意味しますか?もしそうなら、接続がアプリケーションによって使用されたばかりの場合、接続は常に有効ではないでしょうか?

私の理解が間違っていない限り、これは、アプリケーションがそれを使用しようとしたときに無効な接続が例外をスローしたため、接続が有効かどうかをチェックする無駄な時間のようです。

更新: 私が求めていた本当の問題は、単にアプリで失敗したが、まだ最終的に何度も何度も失敗して戻ってプールにチェックされることを古い接続かどうかではないでしょうか?答えが「いいえ」の場合、「爆発的な」接続は決してプールに送り返されないため、チェックイン時のテストは無意味になります。私はtestOnCheckInとc3p0を使っていて、実際にこの深みを潜んでいない何年もの間、テストクエリの間隔を使っていました。

+0

あなたがチェックアウトしたときに接続が有効かどうかは、唯一の関心事であるため、とにかく時間の無駄です。 **これはテストする時間です**。唯一可能なメリットは、古い接続をプールすることではなく、クライアントでのスペース節約である可能性がありますが、クライアントで有効であるとテストされていない場合は、すでに終了している必要があります。 – EJP

+0

@EJPあなたは私の前提に同意しますか?これは確かに時間の無駄です。 –

+0

私が書いたことについて不明な点はありますか? – EJP

答えて

1

アプリケーションが接続を使用した後でこれは意味しますか?

はい

もしそうなら、それは単にアプリケーションで使用された場合、接続は常に有効なのではないでしょうか?

あなたのアプリが接続を使用しても、壊れているように見えるので、例外がスローされましたか?その場合、プールに戻すだけで再び返され、別のリクエストは失敗します。時間がたつと接続が壊れ、失敗した要求の比率が高くなります。

チェックイン後にテストする傾向がある理由は、チェックアウトテストのパフォーマンスへの影響を恐れているからです。あなたの要求は、ネットワークトラフィックを伴うSQLクエリが作成されるまで待たなければなりません。それはあなたのアプリに本当の危険をもたらすことができます。

私は個人的にパフォーマンステストを行っておらず、この問題の深刻さはわかりませんが、それはあなたのアプリケーションから期待される待ち時間のレベルによっても異なります。 @Steve Waldmanが指摘しているように、接続の非同期テストに頼ることもできます。これは、リクエスト処理スレッドの外部で接続をテストする方法です。

+0

ありがとうございます。私はそれが失礼な接続がちょうどクラッシュを引き起こした後であっても、プールがそれを知り、それをチェックインする方法を持たないことは理にかなっていると思う。 –

2

チェックアウトでの接続のテストがパフォーマンス上の問題であるかどうかは、テストの効率性と、チェックアウト時の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を使用して終了します。

+0

"** c3p0(私は珍しいと思います)通知クライアントが経験した例外と、プールがConnectionの有効性について理由を説明できるようにサイレントな接続テストを開始します**"私はこの機能については聞いていません。あなたはソースでこれを見たことがありますか? –

+0

ソースを書きました! https://github.com/swaldman/c3p0/blob/9f97c814aef31b2997d6ecfad1e3875c6136317b/src/java/com/mchange/v2/c3p0/codegen/JdbcProxyGenerator.java#L1003-1010およびhttps://github.com/swaldman/c3p0を参照してください。 /blob/9f97c814aef31b2997d6ecfad1e3875c6136317b/src/java/com/mchange/v2/c3p0/impl/NewPooledConnection.java#L494-575 –

+0

これはクールです:)テストドキュメントの近くのドキュメントのどこかで言及することは素晴らしいことでしょう。このチェックは、例外が発生したとき、または接続がプールに戻った後に非同期になったときに起こりますか?そして、(接続が実際に壊れている場合)何が意味ですか? –

関連する問題