ここで得た回答に基づいて、commons-poolを真剣に検討し始めました。最後に使用したのは 2003 年頃で、おそらくバージョン 1.1 または 1.2 でした。その主なユーザーであるDBCPは、多くの人に欠陥があり、避けるべきであると考えられています。
本番環境でコモンズ プールを使用して独自のプールを作成する人はいますか? 使用するのに最適なプールの種類は何ですか? クライアントTCP ソケットを格納する予定です。
それを置き換える別の汎用プールはありますか?
本番環境でコモンズ プールを使用して独自のプールを作成する人はいますか?
はい、そうです。意図したとおり、プールは TCP 接続を保持します。Spring 経由で配線されているため、Spring の構成を理解していると仮定します。
<bean class="com.company.ConnectionSupplier">
<constructor-arg>
<!-- The ConnectionSupplier wraps an object pool -->
<bean class="org.apache.commons.pool.impl.GenericObjectPool">
<constructor-arg>
<!-- The ObjectPool uses a ConnectionFactory to build new connections -->
<bean class="com.company.ConnectionFactory">
<constructor-arg value="server" />
<constructor-arg value="3000" />
</bean>
</constructor-arg>
<property name="maxActive" value="20" />
<property name="testOnBorrow" value="true" />
</bean>
</constructor-arg>
</bean>
ConnectionFactory は BasePoolableObjectFactory を拡張したもので、SocketFactory の小さなラッパーです。
@First コメント: ConnectionFactory コンストラクターは、サーバーとポートを受け取ります。オーバーライドされた makeObject() で、そのサーバーとポートに接続するソケットを作成します。作成されたソケットを、ソケットを介して通信するためのいくつかの便利なメソッドでラップする「接続」オブジェクトを返します。
接続は、ソケットを介した通信に使用されるプロトコルによって提供される一種の「ping」または「エコー」を使用してテストされます。それが利用できなかった場合、接続の検証/テストは、ソケットが閉じられているかどうかを尋ねることを除いて、実際には不可能です。その場合、例外がスローされた場合、プール内の接続は無効になり、接続を使用するすべてのメソッドはその種の失敗に備えて、別の接続で同じ操作を試行する必要があります。
インスタンス化またはプールからのフェッチのコストが高くなることを確認する必要があります。プールを使用する唯一の有効な状況は最初のものだからです。
NettyまたはApache MINAを調べましたか? どちらも TCP 接続を追跡し、それらの TCP ソケットが使用する通信プロトコルを簡単に実装できるようにする必要があります。
まず、commons-pool 1.3 を使用しないでください。これには、マルチスレッド アプリケーションに関するいくつかの重大な問題があります。
第二に、Java 5 同時実行パッケージには適切なプール実装があります (こちらのサンプルを参照)
MultiThreadedHttpConnectionManagerを確認してください。これは Apache Commons HttpClient 接続プール マネージャーであり、おそらくすぐにニーズに合うでしょう。