Советы по использованию commons-pool в производстве - PullRequest
9 голосов
/ 02 июня 2009

На основании ответа, который я получил здесь , я начал серьезно смотреть на commons-pool . Мой последний опыт использования был около 2003 года, вероятно, версии 1.1 или 1.2. Его основной пользователь, DBCP , многими считается ошибочным и его следует избегать.

Кто-нибудь использует общий пул в рабочей среде для написания собственного пула? Какой тип бассейна лучше всего использовать? Я планирую хранить клиент TCP сокеты в нем.

Есть ли еще один общий пул, который его заменяет?

Ответы [ 5 ]

9 голосов
/ 06 января 2010

Кто-нибудь использует пул общих ресурсов в производство написать свой собственный пул?

Да, я делаю, и пул содержит 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», предоставляемого протоколом, используемым для связи через сокет. Если это не было доступно, проверка / проверка соединения на самом деле невозможна, за исключением запроса сокета, было ли оно закрыто. В этом случае Соединение в пуле было бы недействительным, если бы оно вызвало исключение, и каждый метод, использующий Соединения, должен быть подготовлен к такому сбою и попытаться выполнить ту же операцию с другим соединением.

1 голос
/ 02 января 2010

Вы смотрели на Нетти или Apache MINA ? Они оба будут отслеживать ваши соединения TCP и должны упростить реализацию любого протокола связи, который эти сокеты TCP будут использовать проще.

1 голос
/ 02 января 2010

Вы должны проверить, что инстанция стоит больше или выборка из пула. Потому что единственная допустимая ситуация для использования пула - первая.

0 голосов
/ 29 декабря 2009

Во-первых, не используйте commons-pool 1.3, у него есть серьезные проблемы с многопоточными приложениями.

Во-вторых, пакет параллелизма Java 5 имеет достойные реализации пула (см. Пример здесь )

0 голосов
/ 02 июня 2009

Извлечение MultiThreadedHttpConnectionManager - это менеджер пулов соединений Apache Commons HttpClient, который, вероятно, будет соответствовать вашим потребностям прямо из коробки.

...