dbcp commons java apache-commons apache-commons-dbcp

java - tomcat-dbcp vs commons-dbcp



commons-dbcp maven (6)

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

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

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

  2. La clase de datasource DBCP de Tomcat 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 este blog . No sé si la información es correcta o no.

  4. La documentación oficial de Tomcat menciona claramente que la mayoría de las clases han sido renombradas y reempaquetadas.

Entonces la pregunta es: ¿ cuál usar y cuál es mejor ?


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

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 renombró a org.apache.tomcat.dbcp.dbcp. *

En Tomcat 7 (comenzando con 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 la implementación obsoleta de Apache commons, denominada "El conjunto de conexiones JDBC de Tomcat":

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é el nuevo grupo de Tomcat es mejor:

  • apoyado activamente
  • mucho más pequeño, más fácil de entender y mantener (si le interesa ver la fuente)
  • admite todas las funciones de commons-dbcp + agrega super-útiles como "initSQL", "validationInterval", "jdbcInterceptors" y más


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


Solo para agregar aquí: He notado un comportamiento interesante, aunque se espera pero no pude encontrar ninguna documentación para eso:

Para Tomcat debe definir la fábrica Tomcat ( org.apache.tomcat.jdbc.pool.DataSourceFactory u otras fábricas Tomcat) de lo contrario funcionará como DBCP común.

Existen diferencias entre los valores predeterminados de DBCP común y Tomcat DBCP, especialmente testOnBorrow ( true en DBCP común pero false en Tomcat DBCP).


Tomcat 7 continúa usando DBCP. La razón principal podría estar oculta en sus documentos Tomcat:

  • Apache Commons DBCP se puede configurar para rastrear y recuperar estas conexiones de bases de datos abandonadas. 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 jdbc-pool library, tal vez más rápido en escenarios altamente concurrentes pero no puede cerrar y liberar declaraciones automáticamente (lo que un desarrollador olvidó cerrar) lo que da como resultado posibles fugas 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 son compatibles con JDK1.6 y versiones anteriores. 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: Tras una investigación adicional, el grupo JDBC tiene una forma de cerrar las declaraciones de apertura cuando se cierra una conexión, utilizando un interceptor StatementFinalizer .


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

En tiempo de compilación, Tomcat obtiene las fuentes de los DBCP de los Comunes (la versión depende de la versión de Tomcat, por ejemplo, Tomcat 7.0.27 usa Commons DBCP 1.4), y reemplaza el nombre del paquete ( org.apache.commons -> org.apache.tomcat.dbcp ) y genera el resultado como tomcat-dbcp.jar .

Esto se hace para que los pools internos de JDBC de Tomcat 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 grupo JDBC propio de Tomcat (paquete org.apache.tomcat.jdbc.pool ) .