2009-06-02 17 views
9

Basado en una respuesta que obtuve here, comencé a dar una mirada seria al commons-pool. Mi última experiencia de uso fue alrededor de 2003, probablemente la versión 1.1 o 1.2. Su usuario principal, DBCP, es considerado por muchos como imperfecto y debe evitarse.Consejos para usar commons-pool en producción

¿Alguien usa el grupo común en producción para escribir su propio grupo? ¿Cuál es el mejor tipo de grupo para usar? Planeo almacenar cliente sockets TCP en él.

¿Hay otro grupo genérico que lo reemplace?

+0

Esa es la primera vez que escuché que DBCP tiene fallas ... ¿tiene algo más específico? – skaffman

+0

@skaffman - principalmente perdió conexiones sin una razón –

+0

Esto es interesante: http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html ... menciona la insuficiencia de DBCP. No es de mucha ayuda, ya que es de fuente cerrada. – skaffman

Respuesta

7

¿Alguien usa el fondo común en la producción para escribir un grupo propio?

Sí, lo hago y la agrupación contiene conexiones TCP, como usted pretende. Está conectado a través de la primavera, por lo que suponiendo que entender la configuración de primavera:

<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> 

El ConnectionFactory extiende BasePoolableObjectFactory y es un pequeño envoltorio alrededor de una SocketFactory.

@ Primer comentario: El constructor ConnectionFactory toma un servidor y un puerto. En el makeObject modificado(), crea sockets que se conectan a ese servidor y puerto. Devuelve objetos de 'Conexión' que envuelven el socket creado con algunos métodos de conveniencia para comunicarse a través del socket.

La conexión se prueba utilizando una especie de 'ping' o 'eco' proporcionado por el protocolo utilizado para comunicarse a través del zócalo. Si no hubiera estado disponible, la validación/prueba de la conexión no es realmente posible, excepto preguntar al socket si se ha cerrado. En ese caso, una Conexión en el grupo se habría invalidado si arrojara una excepción y cada método que use Conexiones debería prepararse para ese tipo de falla e intentará la misma operación con otra conexión.

+0

¿Cómo se implementó la fábrica de conexiones? ¿Cómo se prueba la conexión para estar vivo? –

0

Echa un vistazo a MultiThreadedHttpConnectionManager - es un administrador de grupo de conexiones de Apache Commons HttpClient que probablemente se ajuste a tus necesidades nada más sacarlo de la caja.

+1

Como escribí, necesito que el grupo contenga conectores TCP, no conexiones HTTP. –

0

Primero no use commons-pool 1.3, tiene algunos problemas importantes con aplicaciones de múltiples hilos.

En segundo lugar, Java 5 concurency paquete tiene implementaciones piscina decente (ver ejemplo here)

+0

¿Le permite c3p0 usar su grupo sin las cosas de JDBC? –

+0

Se me corrigió, eliminé c3p0, pero mi observación de la piscina de 1,3 comunes no tiene precio, me llevó años encontrarla en producción. el rendimiento aumentó substrancialmente después de actualizar a 1.4 ... –

+3

Estamos usando 1.5 ... Java 5 tiene un buen * Thread * Pool pero estábamos buscando un * Object * Pool –

1

Debe comprobar que los costes instantation más o ir a buscar el de la piscina. Porque la única situación válida para usar el grupo es la primera.

+0

No puedo instanciar nuevos objetos, ya que los objetos son clientes Sockets TCP que necesitan estar vivos el mayor tiempo posible. Cerrar y abrir conexiones se considera un ataque DOS. –

+0

FYI: estamos usando GenericObjectPool de commons-pool en un área diferente pero funciona muy bien. –

1

¿Has mirado en Netty o Apache MINA? Ambos mantendrán un registro de sus conexiones TCP y deberían hacer que la implementación de cualquier protocolo de comunicación que utilicen esos zócalos TCP sea más fácil también.

+0

Por lo que sé, se utilizan para implementar servidores, no clientes. ¿Puedo usarlos para implementar CLIENT tcp pools? –

+1

Sí. Tanto Netty como MINA te permiten escribir un cliente también. – trustin

Cuestiones relacionadas