9

根据我在这里得到的答案,我开始认真看待commons-pool 。我最后一次使用它是在 2003 年左右,可能是 1.1 或 1.2 版本。它的主要用户DBCP被许多人认为是有缺陷的,应该避免使用。

有没有人在生产中使用公共池来编写自己的池?最好使用的泳池类型是什么?我计划在其中存储客户端TCP 套接字。

是否有另一个通用池可以替代它?

4

5 回答 5

9

有没有人在生产中使用公共池来编写自己的池?

是的,我这样做了,并且池保持 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”或“echo”来测试连接。如果不可用,则实际上不可能对连接进行验证/测试,除非询问套接字是否已关闭。在这种情况下,如果池中的 Connection 抛出异常,它就会失效,并且每个使用 Connections 的方法都应该为这种失败做好准备,并尝试对另一个连接进行相同的操作。

于 2010-01-06T14:11:49.653 回答
1

您应该检查实例化成本是否更高或从池中获取。因为使用池的唯一有效情况是第一个。

于 2010-01-01T21:29:19.050 回答
1

你看过NettyApache MINA吗?它们都将跟踪您的 TCP 连接,并且应该使实现这些 TCP 套接字将使用的任何通信协议变得更容易。

于 2010-01-02T18:30:48.357 回答
0

查看MultiThreadedHttpConnectionManager - 它是一个 Apache Commons HttpClient 连接池管理器,可能会立即满足您的需求。

于 2009-06-02T15:39:46.393 回答
0

首先不要使用 commons-pool 1.3,它在多线程应用程序中存在一些重大问题。

其次,Java 5 并发包具有不错的池实现(请参见此处的示例)

于 2009-12-29T12:10:06.687 回答