根据我在这里得到的答案,我开始认真看待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”或“echo”来测试连接。如果不可用,则实际上不可能对连接进行验证/测试,除非询问套接字是否已关闭。在这种情况下,如果池中的 Connection 抛出异常,它就会失效,并且每个使用 Connections 的方法都应该为这种失败做好准备,并尝试对另一个连接进行相同的操作。
您应该检查实例化成本是否更高或从池中获取。因为使用池的唯一有效情况是第一个。
你看过Netty或Apache MINA吗?它们都将跟踪您的 TCP 连接,并且应该使实现这些 TCP 套接字将使用的任何通信协议变得更容易。
查看MultiThreadedHttpConnectionManager - 它是一个 Apache Commons HttpClient 连接池管理器,可能会立即满足您的需求。
首先不要使用 commons-pool 1.3,它在多线程应用程序中存在一些重大问题。
其次,Java 5 并发包具有不错的池实现(请参见此处的示例)