2011-01-17 15 views
62

Parece que hay mucha confusión entre estas dos bibliotecas de agrupación de conexiones. Lo que quiero saber es cuál es mejor (si es que lo es).tomcat-dbcp vs commons-dbcp

Aquí hay algunos puntos que me gustaría presentar ... ¿Podría alguien verificar?

  1. Tomcat DBCP: utiliza el valor por defecto de Tomcat-dbcp.jar que estará presente en el directorio de Tomcat/lib. Usted no necesita necesita bibliotecas commons-dbcp.jar o commons-pool.jar en su web-inf/lib. El controlador DB debe colocarse en tomcat/lib.

  2. Tomcat DBCP clase de fuente de datos es org.apache.tomcat.dbcp.dbcp.BasicDataSource. La clase de datasource de DBCP común es org.apache.commons.dbcp.BasicDataSource.

  3. La única diferencia entre estos dos se puede encontrar en this blog. No sé si la información es correcta o no.

  4. The official Tomcat documentation menciona claramente que la mayoría de las clases han sido renombradas y reempaquetadas.

Así que la pregunta es: cuál usar y cuál es mejor?

+0

En todas las instalaciones de Tomcat que he encontrado hasta ahora, 'tomcat-dbcp.jar' no ** existía ** y' commons-dbcp.jar' era parte del directorio lib de Tomcat. Es decir, hasta que alguien descargó Tomcat del sitio web de ASF e intentó publicarlo la semana pasada. Entonces, definitivamente extraño. – mirabilos

Respuesta

11

Las versiones anteriores de Apache Commons DBCP (es decir, la versión 1.2) tenían algunos problemas desagradables de seguridad de subprocesos en condiciones de carga elevada, lo que los hacía inadecuados para ese tipo de uso. No me sorprende que la gente de Tomcat lo haya reelaborado para solucionar estos problemas.

Sin embargo, tengo entendido que Commons DBCP 1.4 corrige estos problemas. No puedo confirmarlo personalmente, pero puede hacer que la versión de Tomcat sea redundante.

Curiosamente, SpringSource también reescribió Commons DBCP para su versión reempaquetada de Tomcat (tc-Server), y reclaman grandes beneficios de rendimiento de la misma. Sin embargo, no tienen un origen abierto.

+4

DBCP 1.4 es una gran mejora de rendimiento sobre 1.2, y no he tenido más bloqueos o problemas de seguridad de subprocesos desde que actualicé. – Chochos

+0

@Chochos: es bueno saberlo. ¿Para qué tipo de aplicación fue esto? – skaffman

+0

Un conmutador transaccional, realizando más de 200K operaciones diarias. Muchas breves consultas de 1-5 filas, montones y montones de actualizaciones e inserciones. – Chochos

31

Tomcat DBCP es solo una versión renombrada de Apache Commons DBCP, con también un prefijo de nombre de paquete interno diferente.

Al tiempo de construcción, Tomcat Obtiene las fuentes Commons DBCP (la versión depende de la versión de Tomcat, por ejemplo Tomcat 7.0.27 utiliza Commons DBCP 1.4), y hace la sustitución nombre del paquete (org.apache.commons ->org.apache.tomcat.dbcp) y construye el resultado como tomcat-dbcp.jar.

Esto se hace para que los pools internos de Tomcat JDBC nunca entren en conflicto con los posibles usos de las clases de Commons DBCP. Esto evita muchos problemas potenciales de carga de clases.

Editar: Los paquetes "dbcp" tratan de la administración de la fuente de datos. Para la implementación de grupo puro, Commons DBCP depende de Commons Pool (paquete org.apache.commons.pool), pero en Tomcat la implementación del conjunto se reemplaza con el propio JDBC pool de Tomcat (paquete org.apache.tomcat.jdbc.pool).

+18

¿Es eso realmente cierto? [La primera sección de los documentos de Tomcat DBCP] (http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Introduction) reclama una cantidad sustancial de diferencias entre los dos. – pimlottc

+2

Edité mi respuesta para agregar una aclaración sobre la historia de la piscina. –

+0

El enlace de pomlottc apunta al Tomcat JDBC Connection Pool ('org.apache.tomcat.jdbc.pool') que es una biblioteca separada –

6

Tomcat 7 continúa utilizando DBCP.La razón principal podría estar oculto en sus documentos de Tomcat:

  • El Apache Commons DBCP se puede configurar para rastrear y recuperar estos conexiones de base abandonados. No solo puede recuperarlos, sino también generar un seguimiento de pila para el código que abrió estos recursos y nunca los cerró.

  • Tomcat biblioteca JDBC-piscina, tal vez más rápido en escenarios altamente concurrentes, pero no se puede cerrar y declaraciones de liberación automática (que un desarrollador ha olvidado de cerrar), resultando en posibles pérdidas de memoria en algunos controladores JDBC.

Sin embargo uno de los problemas con el código DBCP es el modelo de delegación que utilizan, actualmente sus últimas versiones apoya jdk1.6 e inferior. Apoyar 1.7 significa cambiar al menos una cuarta parte de sus clases, que fue una de las razones por las que la biblioteca de grupo JDBC llegó a existir.

NOTA: En una investigación posterior, el grupo JDBC tiene una forma de cerrar las declaraciones de apertura cuando se cierra una conexión, utilizando un interceptor StatementFinalizer.

3

Sólo para añadir aquí: he notado un comportamiento interesante, aunque se espera, pero no pudo encontrar ninguna documentación para ello:

Para Tomcat es necesario definir la fábrica de Tomcat (org.apache.tomcat.jdbc.pool.DataSourceFactory u otras fábricas Tomcat) en otro caso funcionará como DBCP común.

Hay diferencias en los valores por defecto de entre Común DBCP y Tomcat DBCP, especialmente testOnBorrow (true en común DBCP pero false en Tomcat DBCP).

13

Parece que hay mucha confusión entre estas dos bibliotecas de conexiones de puesta en común. Lo que quiero saber es cuál es mejor (si es que lo es).

TL/DR: estos son iguales, no use ninguno de ellos.

Tomcat-dbcp es el paquete original de apache commons pool incluido en la distribución de Tomcat. Para evitar el paquete class clash se cambió el nombre a org.apache.tomcat.dbcp.dbcp. *

En Tomcat 7 (a partir de 7.0.19 en julio de 2011) se incluyó un conjunto de conexiones adicional en el paquete Tomcat predeterminado (como parte de tomcat-jdbc.jar) como alternativa a rancio aplicación Commons Apache, llamado "El Tomcat agrupación de conexiones JDBC":

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

Este artículo cubre las diferencias entre los dos:

http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html

Breve resumen de por qué nueva Tomcat pool es mejor:

  • con soporte activo
  • mucho más pequeño, más fácil de entender y mantener (si es que quiere buscar en la fuente)
  • soporta todos los bienes comunes DBCP Características + añade los súper útiles, como "initSQL", "validationInterval", "jdbcInterceptors" y más
+0

Explicación increíble !! – Oliver

+0

¡Voy a votar dos si puedo! Gracias por ese enlace de blog. – Adarsha

+2

esto es confuso: 'TL/DR: estos son los mismos, no use ninguno de ellos' vs.' Resumen breve por qué el nuevo grupo de Tomcat es mejor' –

Cuestiones relacionadas