3

unreturnedConnectionTimeout古い接続を解放するように設定しました。これはアクティビティなしで接続を閉じるだけだと思いましたが、指定された時間の後にすべての接続を閉じるだけのようです。

これはバグですか、それとも「設計どおり」ですか?

マニュアルには次のように記載されています。

unreturnedConnectionTimeout接続がチェックアウトされたままになる時間の制限 (秒単位) を定義します。ゼロ以外の値に設定すると、この制限を超える未返されたチェックアウト済みの接続はすぐに破棄され、プール内で置き換えられます。当然のことながら、チェックアウトされた Connection に対するすべての意図された操作が完了するのに十分な時間があるように、このパラメーターを十分に大きな値に設定するように注意する必要があります。このパラメーターを使用して、close() 接続に失敗する信頼性の低いクライアント アプリを単に回避することができます。

このことから、アクティビティは接続の破棄に影響を与えていないと結論付けています。私にはそれは奇妙に聞こえます。なぜアクティブな接続を破棄するのですか?

ありがとう、ミロ

4

2 に答える 2

9

私は c3p0 とあなたが引用した段落の著者です。

unreturnedConnectionTimeoutは、その名前とドキュメントの状態とまったく同じです: 返されない接続のタイムアウトです。ユーザーからのフィードバックに応えて、しぶしぶ実装されました。これは、クライアントがチェックアウトした接続を確実にチェックインする場合、必要または有用ではないためです。それが実装されたとき、開発者が unreturnedConnectionTimeout に怠惰に依存するのではなく、クライアント アプリケーションを修正するように促すために、2 つ目の未承諾の構成パラメーター debugUnreturnedConnectionStackTraces を追加まし

unreturnedConnectionTimeoutの定義はおかしなことではありません。通常、接続プールを使用するアプリケーションは、接続を長期間チェックアウトしたままにしません。これを行うと、パフォーマンスを大幅に低下させることなく、アプリケーションが必要に応じて接続を取得できるようにするという接続プールの目的に反します。接続プールに代わるものは、アプリケーションが接続をチェックアウトし、それらを長期間保持して、いつでも使用できるようにすることです。しかし、長期間接続を維持するのは複雑であることが判明したため、ほとんどのアプリケーションはこれを c3p0 のようなプーリング ライブラリに委譲します。

簡単に変更できない長期間の接続を維持する既存のアプリケーションがあることを理解しています。長期間有効な接続を直接維持するアプリケーションと、プールに委任するアプリケーションとの間のハイブリッド アーキテクチャが必要です。特に、アプリケーションがすでに保持するように設計されている長寿命の接続を維持するのに役立つライブラリが必要です。

残念ながら、c3p0 はそのライブラリではありません。c3p0 (ほとんどの接続プール ライブラリと同様) は、チェックアウトされた接続をクライアントのプロパティと見なし、それらがチェックインされるまで保守作業を行いません。これには 2 つの例外があります。それらがあまりにも長い間チェックアウトされていた場合、c3p0 は、例外が発生したときにチェックアウトされた接続を目に見えないようにテストして、例外が発生した接続がプールに戻るのに適しているかどうか、またはチェックイン時に破棄する必要があるかどうかを判断します。

unreturnedConnectionTimeoutは、必要なパラメーターではありません。Connectionsが一定期間非アクティブになったときに自動的に閉じるが、Connections を無期限にチェックアウトできるようにするものが必要です。そのようなパラメータは と呼ばれる可能性がありinactiveConnectionTimout、c3p0 に追加される可能性がある機能ですが、まだ追加されていません。チェックアウトされた Connection を長期間保持するアプリケーションはほとんどなく、c3p0 には、Connection がチェックインされた後、または Connection がチェックアウトとチェックインの間で遷移するときの障害を観察するのに役立つ機能が満載です。

あなたの(かなり珍しい)ケースでは、これは、単にライブラリによって提供されていない機能が必要であることを意味します。そのことについて謝ります!

于 2013-08-26T10:30:58.697 に答える
1

アクティブにするunreturnedConnectionsことができます。実行にかかる時間によって異なります。データベースに対するクエリ。アプリケーションで期待できる最長の操作よりも大きな値にタイムアウトを設定する必要があります。値が十分であることがわかっていて、c3p0 がまだアクティブな接続を閉じている場合は、接続がどこかでリークしたことを意味します (適切に閉じられていない可能性があります)。

于 2013-08-26T08:30:39.770 に答える