web-dev-qa-db-fra.com

tomcat-dbcp vs commons-dbcp

Il semble qu'il y ait beaucoup de confusion entre ces deux bibliothèques de regroupement de connexions. Ce que je veux savoir, c'est lequel est le meilleur (le cas échéant)?

Voici quelques points que j'aimerais mettre en avant ... Quelqu'un pourrait-il vérifier?

  1. Tomcat DBCP: utilise le Tomcat-dbcp.jar par défaut qui sera présent dans votre répertoire Tomcat/lib. Vous ne le faites pas avez besoin des bibliothèques commons-dbcp.jar ou commons-pool.jar dans votre inf-lib/web. Le pilote DB doit être placé dans Tomcat/lib.

  2. La classe de source de données Tomcat DBCP est org.Apache.Tomcat.dbcp.dbcp.BasicDataSource. La classe de source de données DBCP de Commons est org.Apache.commons.dbcp.BasicDataSource.

  3. La seule différence entre ces deux se trouve dans ce blog . Je ne sais pas si les informations sont correctes ou non.

  4. La documentation officielle de Tomcat mentionne clairement que la plupart des classes viennent d'être renommées et reconditionnées.

La question est donc: lequel utiliser et lequel est meilleur ?

68
rabbit

Tomcat DBCP est juste une version renommée d'Apache Commons DBCP, avec également un préfixe de nom de package interne différent.

Au moment de la construction, Tomcat récupère les sources Commons DBCP (la version dépend de la version Tomcat, par exemple Tomcat 7.0.27 utilise Commons DBCP 1.4), et fait le remplacement du nom du package (org.Apache.commons -> org.Apache.Tomcat.dbcp) et construit le résultat comme Tomcat-dbcp.jar.

Ceci est fait pour que les pools JDBC Tomcat internes n'entrent jamais en conflit avec les utilisations possibles des applications des classes DBCP Commons. Cela évite de nombreux problèmes potentiels de chargement de classe.

Edit: Les packages "dbcp" concernent la gestion des sources de données. Pour l'implémentation de pool pur, Commons DBCP dépend de Commons Pool (package org.Apache.commons.pool), mais dans Tomcat, l'implémentation du pool est remplacée par celle de Tomcat pool JDBC (package org.Apache.Tomcat.jdbc.pool).

35
Florent Guillaume

Il semble qu'il y ait beaucoup de confusion entre ces deux bibliothèques de regroupement de connexions. Ce que je veux savoir, c'est lequel est le meilleur (le cas échéant)?

TL/DR: ce sont les mêmes, ne les utilisez pas.

Tomcat-dbcp est le reconditionnement d'origine du pool commun Apache inclus dans la distribution Tomcat. Pour éviter le conflit de classe, le package a été renommé org.Apache.Tomcat.dbcp.dbcp. *

Dans Tomcat 7 (à partir de la version 7.0.19 en juillet 2011), un pool de connexions supplémentaire a été inclus dans le package Tomcat par défaut (dans le cadre de Tomcat-jdbc.jar) comme alternative à l'implémentation Apache Commons obsolète, appelé "le pool de connexions Tomcat JDBC":

https://Tomcat.Apache.org/Tomcat-7.0-doc/jdbc-pool.html

Cet article couvre les différences entre les deux:

http://vigilbose.blogspot.com/2009/03/Apache-commons-dbcp-and-Tomcat-jdbc.html

Bref pourquoi la nouvelle piscine Tomcat est meilleure:

  • activement soutenu
  • beaucoup plus petit, plus facile à comprendre et à entretenir (si vous voulez regarder la source)
  • prend en charge toutes les fonctionnalités de commons-dbcp + en ajoute des super utiles comme "initSQL", "validationInterval", "jdbcInterceptors" et plus
14
Pavel

Les anciennes versions d'Apache Commons DBCP (c'est-à-dire la version 1.2) présentaient des problèmes de sécurité des threads désagréables dans des conditions de charge élevée, ce qui le rend impropre à ce type d'utilisation. Cela ne me surprend pas que les gens de Tomcat l'ont retravaillé pour résoudre ces problèmes.

Cependant, je crois comprendre que Commons DBCP 1.4 résout ces problèmes. Je ne peux pas le confirmer personnellement, mais cela peut rendre la version Tomcat redondante.

Fait intéressant, SpringSource a également réécrit Commons DBCP pour leur version reconditionnée de Tomcat (tc-Server), et ils en revendiquent de gros avantages en termes de performances. Cependant, ils n'ont pas opté pour l'open source.

11
skaffman

Tomcat 7 continue d'utiliser DBCP. La raison principale pourrait être cachée dans leurs documents Tomcat:

  • Le DBCP Apache Commons peut être configuré pour suivre et récupérer ces connexions de base de données abandonnées. Il peut non seulement les récupérer, mais également générer une trace de pile pour le code qui a ouvert ces ressources et ne les a jamais fermées.

  • Bibliothèque Tomcat jdbc-pool, peut-être plus rapide dans des scénarios hautement simultanés, mais ne peut pas fermer et publier automatiquement des instructions (qu'un développeur a oublié de fermer), ce qui peut entraîner des fuites de mémoire dans certains pilotes jdbc.

Cependant, l'un des problèmes avec le code DBCP est le modèle de délégation qu'ils utilisent, actuellement leurs dernières versions prennent en charge JDK1.6 et inférieur. Prendre en charge 1.7 signifie changer au moins un quart de leurs classes, ce qui est l'une des raisons pour lesquelles la bibliothèque de pools JDBC a vu le jour.

REMARQUE: après une enquête plus approfondie, le pool JDBC a un moyen de fermer les instructions d'ouverture lorsqu'une connexion est fermée, à l'aide d'un intercepteur StatementFinalizer.

6
austindz

Juste pour ajouter ici: j'ai remarqué un comportement intéressant, bien qu'il soit attendu, mais je n'ai trouvé aucune documentation pour cela:

Pour Tomcat, vous devez définir la fabrique Tomcat (org.Apache.Tomcat.jdbc.pool.DataSourceFactory ou d'autres usines Tomcat) sinon il fonctionnera comme DBCP commun.

Il existe des différences entre les valeurs par défaut de Common DBCP et Tomcat DBCP, spécialement testOnBorrow (true dans Common DBCP mais false dans Tomcat DBCP).

4
arviarya

Voici une liste des avantages de l'utilisation du pool JDBC Tomcat plutôt que de commons-dbcp: http://people.Apache.org/~fhanik/jdbc-pool/jdbc-pool.html

4
Clint Eastwood