Советы по использованию commons-pool в производстве
Основываясь на ответе, который я получил здесь, я начал серьезно смотреть на общий фонд. Мой последний опыт использования был около 2003 года, вероятно, версии 1.1 или 1.2. Его основной пользователь, DBCP, считается многими недостатками и его следует избегать.
Кто-нибудь использует общий пул в производстве, чтобы написать свой собственный пул? Какой тип бассейна лучше всего использовать? Я планирую хранить клиентские TCP-сокеты в нем.
Есть ли еще один общий пул, который его заменяет?
5 ответов
Кто-нибудь использует общий пул в производстве, чтобы написать свой собственный пул?
Да, я делаю, и пул содержит 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.
@ Первый комментарий: конструктор ConnectionFactory использует сервер и порт. В переопределенной функции makeObject() он создает сокеты, которые подключаются к этому серверу и порту. Он возвращает объекты "Соединение", которые обертывают созданный сокет некоторыми удобными методами для связи через сокет.
Соединение проверяется с использованием типа "ping" или "echo", предоставляемого протоколом, используемым для связи через сокет. Если это не было доступно, проверка / проверка соединения на самом деле невозможна, за исключением запроса сокета, было ли оно закрыто. В этом случае Соединение в пуле было бы недействительным, если бы оно вызвало исключение, и каждый метод, использующий Соединения, должен быть подготовлен к такому сбою и попытаться выполнить ту же операцию с другим соединением.
Вы должны проверить, что инстанция стоит больше или выборка из пула. Потому что единственная допустимая ситуация для использования пула - первая.
Вы смотрели в Netty или Apache MINA? Они оба будут отслеживать ваши TCP-соединения и должны упростить реализацию любого протокола связи, который будут использоваться этими сокетами TCP.
Во-первых, не используйте commons-pool 1.3, у него есть серьезные проблемы с многопоточными приложениями.
Во-вторых, пакет конкурентности Java 5 имеет достойные реализации пула (см. Пример здесь)
Проверьте MultiThreadedHttpConnectionManager - это менеджер пула соединений Apache Commons HttpClient, который, вероятно, будет соответствовать вашим потребностям прямо из коробки.