2009-06-02 3 views
9

hereの回答に基づいて、私はcommons-poolに深刻な外観を与え始めました。私の最後の使用経験は2003年頃、おそらくバージョン1.1または1.2でした。その主なユーザDBCPは、多くの人に欠陥のあるものとみなされ、避けられるべきです。コモンズプールをプロダクションで使用するためのヒント

誰かが自分のプールに書き込むために生産現場でコモンズプールを使用していますか?使用する最良のプールタイプは何ですか?私はそれにクライアント TCPソケットを格納する予定です。

それを置き換える別の汎用プールがありますか?

+0

DBCPに欠陥があると聞いたのはこれが初めてです...もっと具体的なものがありますか? – skaffman

+0

@skaffman - ほとんどの理由で接続が失われた –

+0

これは面白いです:http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html ... DBCPの不十分さについて言及しています。しかし、クローズドソースなので、それほど助けにはならない。 – skaffman

答えて

7

でコモンズプールを使用する人は誰ですか?自分でプールを作成しますか?

はい、あなたが意図したように、プールにはTCP接続が保持されます。

<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の周りの小さなラッパーです:それはあなたがSpring構成を理解すると仮定すると、春を経てアップ配線されます。

@Firstコメント: ConnectionFactoryコンストラクタは、サーバーとポートを使用します。オーバーライドされたmakeObject()では、そのサーバーとポートに接続するソケットを作成します。作成したソケットをラップする 'Connection'オブジェクトを返します。これは、ソケットを介して通信するための便利な方法です。

接続は、ソケットを介して通信するために使用されるプロトコルによって提供される「ping」または「echo」の種類を使用してテストされます。ソケットが閉じられているかどうかを確認することを除いて、接続の検証/テストは実際には可能ではありません。その場合、プール内のConnectionは例外をスローした場合に無効になり、Connectionsを使用するすべてのメソッドはそのような種類の障害に対して準備され、別の接続で同じ操作が試されます。

+0

接続ファクトリはどのように実装しましたか?あなたは生きているために接続をどのようにテストしますか? –

0

チェックアウトMultiThreadedHttpConnectionManager - これはおそらくすぐにあなたのニーズに合うApache Commons HttpClient接続プールマネージャです。

+1

私が書いたように、HTTP接続ではなくTCPソケットを含むプールが必要です。 –

0

まず、commons-pool 1.3を使用しないでください。マルチスレッドアプリケーションでは大きな問題があります。

第二に、Java 5の並行性のパッケージには、まともなプールの実装を持っている(サンプルhereを参照)

+0

c3p0はJDBCを使わずにプールを使用できますか? –

+0

私はc3p0を削除して修正しましたが、私の1.3コモンズプールの発言は貴重なものです。パフォーマンスは1.4にアップグレードした後に無残にジャンプしました... –

+3

私たちは1.5を使用しています... Java 5は実際に素晴らしい*スレッド*プールを持っていますが、オブジェクト*プールを探していました –

1

あなたはより多くのinstantationコストやプールから取り出していることを確認する必要があります。プールを使用する唯一の有効な状況は、最初のものです。

+0

オブジェクトがクライアントなので、 TCPソケットはできるだけ長く生きている必要があります。接続のクローズとオープンはDOS攻撃と見なされます。 –

+0

FYI:私たちはCommons-PoolのGenericObjectPoolを別の領域で使用していますが、それはうまく機能します。 –

1

NettyまたはApache MINAを調べましたか?彼らは両方ともあなたのTCP接続を追跡し、それらのTCPソケットがどんな通信プロトコルでも簡単に実装するようにすべきです。

+0

私が知る限り、それらはクライアントではなくサーバーを実装するために使用されます。クライアントtcpプールを実装するためにそれらを使用できますか? –

+1

はい。 NettyとMINAの両方でクライアントを作成することもできます。 – trustin

関連する問題