5

私は Apache Commons Pool ライブラリを使用して、couchbase 接続のプールを維持しています (あらゆる種類の接続と見なすことができますが、実際には問題ではありません)。

私が直面している問題は、オブジェクトをプールに返す唯一の方法が、 GenericObjectPoolクラスからreturnObjectメソッドを呼び出してプログラムで行うことだということです。これにより、アプリケーションでの例外や予期しない動作に関係なく、アプリケーションはプールから借用されたオブジェクトの戻りを保証するようになります。

アプリケーション全体でオブジェクトのプールへの戻りを制御しているとはいえ、オブジェクトの戻りをプログラマだけに依存するのは危険だと思います。特定のタイムアウトを超えるとオブジェクトを自動的に返す方法を知っている人はいますか (オブジェクトを回収します)。借用したオブジェクトのタイムアウトを超えると、プールに新しいオブジェクトを作成させることもできます。

PS: 私のアプリケーションは、分散 memcache サーバー (Couchbase) に接続する一連の REST Web サービスを公開しています。プールは、Couchbase への一連の接続を作成します。

どんな提案も役に立ちます!

編集

私が試した最初の解決策は、プールに格納されているオブジェクトのタイプ ( CouchbaseClient ) からの接続オブジェクトを含む新しいクラス ( CouchbaseClientHandler ) を作成することでしCouchbaseClientHandlerにfinalizeメソッドを実装し、このオブジェクトへの参照が予期しない例外によって失われた場合に、関連するオブジェクトが実際にプールに返されるようにしました。ガベージ コレクターがオブジェクトを破棄すると、オブジェクトが返されます。これは期待どおりに機能しませんでした。ガベージ コレクターが再利用オブジェクトをいつ到着するかを予測することは不可能であり、通常は必要以上に時間がかかります。

私が現在実際に取り組んでいるソリューションは少し異なりますが、より安全です。私のプールは Web サービスによって使用されることを意図しており、すべての Web サービスは個別の一意のスレッドで実行されているため (私は Tomcat で Jersey を使用しています)、一意のスレッド ID をマップする静的ハッシュマップ変数を使用することにしました。 Web サービスの実行時にプールから借用して作成されたCouchbaseClientオブジェクトのリストに。私の Web サービスは、何が起こってもハンドラー メソッドが返す前に最終出力を処理するように設計されているため、借用したオブジェクト (接続) をプールに返すメソッドを常に実行することができます。効果的にプールに戻されていません。

これは私にとってはかなりうまくいきましたが、返されていない借用オブジェクトをタイムアウトで要求またはワイプするより良い方法があるかどうかを本当に知りたいです。

4

1 に答える 1

3

破棄/新規作成のアプローチに問題がなく、コモンズ プールのバージョン 2.0 以降を使用していると仮定すると、放棄されたオブジェクトの追跡と削除を使用して、オブジェクトが借用されて返されない場合に容量が永久にリークされないようにすることができます。構成設定と、引数として AbandonedConfig インスタンスを取る GenericObjectPool コンストラクターについては、AbandonedConfig の javadoc を参照してください。放棄されたオブジェクトの追跡と削除が有効になっていると、プールの容量が少ない場合、プールは、借用されたが removeAbandonedTimeout よりも長く返されなかったインスタンスを破棄します。

何らかの理由でバージョン 1.x プールを使用する必要がある場合は、ソースを取得するか、DBCP 1.x に同梱されている AbandonedObjectPool を直接使用できます。

于 2015-01-05T20:10:31.917 に答える