37

Java でのオブジェクト プールの最新の実装を探しています。apache commons のものを見ることができますが、正直に言うと、ジェネリックを使用するものと、より最近のバージョンの Java の並行性のものの方が好きです。

コモンズプールは本当にうまく機能していますか? コードはきれいに見えますが、ええと、醜いです。

カスタムの活性検証などを可能にするものが必要です。

ありがとう!

4

9 に答える 9

18

Apache Commons のものを見ることができますが、正直なところ、ジェネリックを使用するものと、より最近のバージョンの Java の並行性のものの方が好きです。

実際のところ、この種のプロジェクト (一般的なオブジェクト プール) は、最近ではほとんど必要とされていないため (オブジェクトの作成は安価です)、あまり人気がありません。これはおそらく、それらの多くが見られない理由を説明しています (実際、私は Commons Pool しか知りません)。

そうは言っても、ジェネリックが主な関心事である場合は、Commons Pool にパッチを当てることができます。POOL-83を参照してください。パッチが添付されています。

コモンズプールは本当にうまく機能しますか? コードはきれいに見えますが、ええと、醜いです。

いくつかの既知のバグ(4 つ) がありますが、私の知る限りでは動作します。最後の文についてですが、もっと良いものを書けると思うなら、そしてそのための時間があれば、それをやってみませんか?

カスタムの活性検証などを可能にするものが必要です。

無限の数のオプションはありません。また

  1. 必要なすべてを実行するものを見つけてください (そのようなライブラリは知りませんが、何もないという意味ではありません)。
  2. 必要なすべてをすぐに実行できるものが見つからない場合は、既存のソリューションを拡張します。
  3. 独自のソリューションを展開します。
于 2010-09-07T10:18:41.203 に答える
8

Commons Pool は、あなたのプロジェクトの良い候補です。

  1. ジェネリック インターフェイス- コモンズ プールの最も明白な問題は、ジェネリック以前のインターフェイスです。これを回避する方法はいくつかあります。あなたはできる
    1. キャスティングを行います。
    2. あなたのためにキャストを行う並列インターフェースを実装します。また
    3. Pascal が特定したパッチを使用する
  2. より最近の Java からの並行処理 - これは、気にする必要のない実装の詳細です。並行性が正しい場合、正確性がどのように達成されたかは問題ではありません。あるいは、より新しいものを使用しているが同時実行性が間違っているプール実装は、依然として候補としては不十分です。
  3. 醜いコード- 結婚するのではなく、使用することになっています。
  4. カスタムの活性検証-オブジェクトの活性をテストするためにvalidateObjectを実装します。死んだオブジェクトは破壊されます。Cronタスクを実装して、オブジェクトを定期的に借用して返すこともできます。これにより、死んだオブジェクトを適時に強制的に削除できます。
于 2010-09-11T08:21:17.077 に答える
7

必要な機能を知らずに推奨するのは難しいです。

プール内のオブジェクトの数が固定されている場合は、@codedevourが言及した質問からこの例BlockingQueueのようにを使用できます

プールする値をキーに関連付けることができる場合は、 GuavaのMapMakerを使用できます

ConcurrentMap<Key, Connection> connections = new MapMaker()
       .concurrencyLevel(32)
       .softKeys()
       .weakValues()
       .expiration(30, TimeUnit.MINUTES)
       .evictionListener(
           new MapEvictionListener<Key, Connection>() {
             public onEviction(Key key, Connection connection) {
               connection.close();
             } 
           });
       .makeComputingMap(
           new Function<Key, Connection>() {
             public Connection apply(Key key) {
               return createConnection(key);
             }
           });
于 2010-09-11T15:41:00.667 に答える
3

KBOP をチェックアウトします。これは、単一のキーを単一のオブジェクトに、または単一のキーを複数のオブジェクト プールにブロックするスレッド セーフです。軽量で、追加の依存関係を追加しません。

http://www.kbop.org

于 2013-04-21T17:51:24.827 に答える
2

さらに別のプール ( yapool ) には、リスナーを介してプール イベントに作用するオプションを備えた汎用プール実装が含まれています ( example )。これにより、プールの動作のカスタマイズ、機能の追加、およびプール リソースの使用状況の診断において多くの柔軟性が提供されます。または、プールの実装を拡張して、独自の目的の動作を追加することもできます ()。プールの実装は既に相互に拡張されているため (基本 --> バインド --> プルーニング)、これは比較的簡単なはずです。

まず、単純なBoundPoolを使用して独自のファクトリを設定するか (前述のプール イベントの例の「LongFactory」を参照)、または単にObjectPoolを使用します。

Yapool には「同期された」ブロックがなく、非常に高速です。

于 2013-12-08T15:33:52.593 に答える
2

これはあなたの質問に関連しているようです。おそらく、オブジェクトプールを自分で作成することを本当に検討する必要があります。この基本的な Java オブジェクト プールは機能しますか? .

プーリングは当初、特にオブジェクトの作成とガベージ コレクションのパフォーマンスの低下に対するチューニング アクションとして導入されました。最新の JVM > 1.4 では、典型的なビジネス アプリケーションでメモリ管理を最適化するためにプーリングは不要になりました。ガベージ コレクターのパフォーマンスに悪影響を及ぼすことさえあります。すべてのメソッド呼び出しで何百万ものインスタンスを作成するなどの特別なケースでは、それでも効果がある可能性があります。

ただし、インスタンス プーリングは、カスタムの "ポスト コンストラクション" が遅いオブジェクトには依然として興味深いものです。場合によっては、オブジェクトの作成後にいくつかの依存関係を注入したり、構成を読み取ったりする必要があります。これは遅くなる可能性があり、何度も何度も実行する必要はありません。このような場合、オブジェクト プーリングによって全体的なパフォーマンスが向上します。

Adam Bien --オブジェクト プーリングは依然として有用である - 理由はまったく異なる

commons Pool Framework の強化についてどう思いますか? リファクタリングを行って一般的な部分を追加することもできます。他の人にとっても良いでしょう。

于 2010-09-10T14:01:06.247 に答える
1

http://code.google.com/p/spf4j/にオブジェクト プールの実装があります 。Apache Commons のものよりも優れた実装だと思います。コードはそれほど醜くなく、パフォーマンスも優れています...

于 2013-03-16T11:50:36.867 に答える
0

ジェネリック側では、非ジェネリック ライブラリを使用して、キャストを処理する非ジェネリック ライブラリにアクセスするために使用するラッパーを作成してみませんか? そうすれば、キャストが行われる場所が 1 か所になり、少なくともコードが少しクリーンアップされます。

于 2010-09-13T08:50:01.873 に答える
-4

プールは従来の方法であり、キャッシュは最新の方法です。そして、キャッシュの最新の実装が数多くあります。

これら 2 つの違いについては、http: //www.informit.com/guides/content.aspx?g=java&seqNum=104を参照してください。

私の見解では、キャッシュ ライブラリを使用してオブジェクトをプールできますが、その逆はできません。キャッシュからオブジェクトを取得した後、オブジェクトを再初期化することを忘れないでください。では、1 つだけですべてを達成できるのに、わざわざ 2 つの異なる動物 (キャッシュとプール) を用意する必要はありません。

于 2010-09-08T03:49:09.593 に答える