Советы по использованию 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, который, вероятно, будет соответствовать вашим потребностям прямо из коробки.

Другие вопросы по тегам