Es scheint, dass zwischen diesen beiden Verbindungspooling-Bibliotheken große Verwirrung herrscht. Was ich wissen möchte ist, welches besser ist (wenn überhaupt)?
Hier sind einige Punkte, die ich ansprechen möchte ... Könnte jemand bitte überprüfen?
Tomcat DBCP: Verwendet die Standarddatei tomcat-dbcp.jar, die in Ihrem Verzeichnis tomcat / lib vorhanden ist. Sie nicht commons-dbcp.jar oder commons-pool.jar Bibliotheken in Ihrem Web-inf / lib benötigen. Der DB-Treiber sollte in tomcat / lib abgelegt werden.
Tomcat DBCP-Datenquellenklasse ist
org.apache.tomcat.dbcp.dbcp.BasicDataSource
. Commons DBCP-Datenquellenklasse istorg.apache.commons.dbcp.BasicDataSource
.Der einzige Unterschied zwischen diesen beiden kann in diesem Blog gefunden werden . Ich weiß nicht, ob die Informationen korrekt sind oder nicht.
In der offiziellen Tomcat-Dokumentation wird deutlich erwähnt, dass die meisten Klassen gerade umbenannt und neu verpackt wurden.
Die Frage ist also: Welches ist zu verwenden und welches ist besser ?
tomcat-dbcp.jar
es nicht gab undcommons-dbcp.jar
die Teil des Tomcat lib-Verzeichnisses waren. Das heißt, bis jemand Tomcat von der ASF-Website heruntergeladen und letzte Woche versucht hat, es auszuführen. Also definitiv komisch.Antworten:
Tomcat DBCP ist nur eine umbenannte Version von Apache Commons DBCP mit einem anderen internen Paketnamenpräfix.
Zur Erstellungszeit ruft Tomcat die Commons-DBCP-Quellen ab (die Version hängt von der Tomcat-Version ab, z. B. verwendet Tomcat 7.0.27 Commons DBCP 1.4), ersetzt den Paketnamen (
org.apache.commons
->org.apache.tomcat.dbcp
) und erstellt das Ergebnis alstomcat-dbcp.jar
.Dies geschieht, damit die internen Tomcat-JDBC-Pools niemals mit möglichen Anwendungsverwendungen der Commons-DBCP-Klassen in Konflikt stehen. Dies vermeidet viele potenzielle Probleme beim Laden von Klassen.
Bearbeiten: In den "dbcp" -Paketen geht es um die Verwaltung von Datenquellen. Für die reine Poolimplementierung hängt Commons DBCP vom Commons Pool (Paket
org.apache.commons.pool
) ab. In Tomcat wird die Implementierung des Pools jedoch durch den eigenen JDBC-Pool (Paketorg.apache.tomcat.jdbc.pool
) von Tomcat ersetzt .quelle
org.apache.tomcat.jdbc.pool
), der eine separate Bibliothek istTL / DR: Diese sind gleich, verwenden Sie keine von beiden.
Tomcat-dbcp ist das ursprüngliche Re-Paket des Apache Commons-Pools, das in der Tomcat-Distribution enthalten ist. Um Klassenkonflikte zu vermeiden, wurde das Paket in org.apache.tomcat.dbcp.dbcp umbenannt. *
In Tomcat 7 (ab 7.0.19 im Juli 2011) wurde im Standard-Tomcat-Paket (als Teil von tomcat-jdbc.jar) ein zusätzlicher Verbindungspool als Alternative zur veralteten Apache-Commons-Implementierung mit dem Namen "The Tomcat JDBC Connection Pool" aufgenommen:
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
Dieser Artikel behandelt die Unterschiede zwischen den beiden:
http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html
Kurze Zusammenfassung, warum der neue Tomcat-Pool besser ist:
quelle
TL/DR: these are the same, don't use either of them
vs.Short summary why new Tomcat pool is better
Ältere Versionen von Apache Commons DBCP (dh Version 1.2) hatten unter Bedingungen hoher Last einige unangenehme Probleme mit der Thread-Sicherheit, so dass es für diese Art der Verwendung ungeeignet war. Es überrascht mich nicht, dass die Tomcat-Leute es überarbeitet haben, um diese Probleme zu beheben.
Nach meinem Verständnis behebt Commons DBCP 1.4 diese Probleme. Ich kann das nicht persönlich bestätigen, aber es kann die Tomcat-Version überflüssig machen.
Interessanterweise hat SpringSource auch Commons DBCP für die neu gepackte Version von Tomcat (tc-Server) neu geschrieben und behauptet, große Leistungsvorteile daraus zu ziehen. Das haben sie allerdings nicht als Open-Source-Lösung.
quelle
Tomcat 7 verwendet weiterhin DBCP. Der Hauptgrund könnte in ihren Tomcat-Dokumenten verborgen sein:
Eines der Probleme mit DBCP-Code ist jedoch das von ihnen verwendete Delegierungsmodell. Derzeit unterstützen die neuesten Versionen JDK1.6 und niedriger. 1.7 zu unterstützen bedeutet, mindestens ein Viertel ihrer Klassen zu ändern, was einer der Gründe war, warum die JDBC-Poolbibliothek ins Leben gerufen wurde.
ANMERKUNG: Nach weiteren Untersuchungen kann der JDBC-Pool Eröffnungsanweisungen schließen, wenn eine Verbindung mit einem
StatementFinalizer
Interceptor geschlossen wird .quelle
Nur um hier hinzuzufügen: Ich habe ein interessantes Verhalten festgestellt, obwohl es erwartet wird, konnte aber keine Dokumentation dafür finden:
Für Tomcat müssen Sie die Tomcat-Factory (
org.apache.tomcat.jdbc.pool.DataSourceFactory
oder andere Tomcat-Fabriken) definieren, da sie sonst als Common DBCP funktioniert.Insbesondere gibt es Unterschiede zwischen den Standardwerten von Common DBCP und Tomcat DBCP
testOnBorrow
(true
in Common DBCP, aberfalse
in Tomcat DBCP).quelle
Hier ist eine Liste der Vorteile der Verwendung des Tomcat JDBC-Pools anstelle von commons-dbcp: http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
quelle