Het lijkt erop dat er veel verwarring bestaat tussen deze twee bibliotheken voor het poolen van verbindingen. Wat ik wil weten is welke beter is (of helemaal niet)?
Hier zijn enkele punten die ik naar voren wil brengen… Kan iemand dit verifiëren?
-
Tomcat DBCP: gebruikt de standaard tomcat-dbcp.jar die aanwezig zal zijn in uw tomcat/lib-directory. U heeft geencommons-dbcp.jar of commons-pool.jar bibliotheken nodig in uw web-inf/lib. Het DB-stuurprogramma moet in tomcat/lib worden geplaatst.
-
Tomcat DBCP-gegevensbronklasse is
org.apache.tomcat.dbcp.dbcp.BasicDataSource
.
Commons DBCP-gegevensbronklasse isorg.apache.commons.dbcp.BasicDataSource
. -
Het enige verschil tussen deze twee is te vinden in deze blog. Weet niet of de informatie juist is of niet.
-
De officiële Tomcat-documentatievermeldt duidelijk dat de meeste klassen zojuist een nieuwe naam hebben gekregen en opnieuw zijn verpakt.
Dus de vraag is: welke te gebruiken en welke is beter?
Antwoord 1, autoriteit 100%
Tomcat DBCP is slechts een hernoemde versie van Apache Commons DBCP, met ook een ander voorvoegsel voor de interne pakketnaam.
Tijdens het bouwen haalt Tomcat de Commons DBCP-bronnen op (de versie is afhankelijk van de Tomcat-versie, Tomcat 7.0.27 gebruikt bijvoorbeeld Commons DBCP 1.4), en vervangt de pakketnaam (org.apache.commons
-> org.apache.tomcat.dbcp
) en bouwt het resultaat op als tomcat-dbcp.jar
.
Dit wordt gedaan zodat de interne Tomcat JDBC-pools nooit conflicteren met mogelijk toepassingsgebruik van de Commons DBCP-klassen. Dit voorkomt veel potentiële problemen met het laden van klassen.
Bewerken:de “dbcp”-pakketten gaan over gegevensbronbeheer. Voor de pure pool-implementatie is Commons DBCP afhankelijk van Commons Pool (pakket org.apache.commons.pool
), maar in Tomcat wordt de implementatie van de pool vervangen door Tomcat’s eigen JDBC-pool(pakket org.apache.tomcat.jdbc.pool
).
Antwoord 2, autoriteit 38%
Het lijkt erop dat er veel verwarring bestaat tussen deze twee bibliotheken voor het poolen van verbindingen. Wat ik wil weten is welke beter is (of helemaal niet)?
TL/DR: deze zijn hetzelfde, gebruik geen van beide.
Tomcat-dbcp is het originele herpakket van de apache commons pool die is opgenomen in de Tomcat-distributie. Om klassenclash te vermijden werd het pakket hernoemd naar org.apache.tomcat.dbcp.dbcp.*
In Tomcat 7 (beginnend met 7.0.19 in juli 2011) werd een extra verbindingspool opgenomen in het standaard Tomcat-pakket (als onderdeel van tomcat-jdbc.jar) als alternatief voor de verouderde apache commons-implementatie, genaamd “The Tomcat JDBC Connection Zwembad”:
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool .html
Dit artikel behandelt de verschillen tussen de twee:
http://vigilbose.blogspot.com/2009/03 /apache-commons-dbcp-en-tomcat-jdbc.html
Korte samenvatting waarom de nieuwe Tomcat-pool beter is:
- actief ondersteund
- veel kleiner, gemakkelijker te begrijpen en te onderhouden (als je naar de bron wilt kijken)
- ondersteunt alle commons-dbcp-functies + voegt superhandige functies toe zoals “initSQL”, “validationInterval”, “jdbcInterceptors” en meer
Antwoord 3, autoriteit 30%
Oudere versies van Apache Commons DBCP (d.w.z. versie 1.2) hadden enkele vervelende thread-veiligheidsproblemen onder hoge belasting, waardoor het ongeschikt was voor dat soort gebruik. Het verbaast me niet dat de Tomcat-mensen het hebben herwerkt om deze problemen op te lossen.
Ik heb echter begrepen dat Commons DBCP 1.4 deze problemen oplost. Ik kan dat niet persoonlijk bevestigen, maar het kan de Tomcat-versie overbodig maken.
Interessant is dat SpringSource ook Commons DBCP herschreef voor hun opnieuw verpakte versie van Tomcat (tc-Server), en ze claimen er grote prestatievoordelen van te hebben. Ze hebben dat echter niet open source gemaakt.
Antwoord 4, autoriteit 16%
Tomcat 7 blijft DBCP gebruiken. De belangrijkste reden kan verborgen zijn in hun Tomcat-documenten:
De Apache Commons DBCP kan worden geconfigureerd om deze te volgen en te herstellen
verbroken databaseverbindingen. Het kan ze niet alleen herstellen, maar ook
genereer een stacktracering voor de code die deze bronnen heeft geopend en
heb ze nooit gesloten.Tomcat jdbc-pool-bibliotheek, misschien sneller in zeer gelijktijdige scenario’s, maar kan niet worden gesloten en
release-statements automatisch (die een ontwikkelaar is vergeten te sluiten) resulterend in
mogelijke geheugenlekken in sommige jdbc-stuurprogramma’s.
Echter een van de problemen met DBCP-code is het delegatiemodel dat ze gebruiken, momenteel ondersteunen hun nieuwste versies JDK1.6 en lager. Het ondersteunen van 1.7 betekent het veranderen van ten minste een vierde van hun klassen, wat een van de redenen was waarom de JDBC-poolbibliotheek ontstond.
OPMERKING: bij nader onderzoek heeft de JDBC-pool wel een manier om openingsinstructies te sluiten wanneer een verbinding wordt verbroken, met behulp van een StatementFinalizer
-interceptor.
Antwoord 5, autoriteit 11%
Alleen om hier toe te voegen:
Ik heb een interessant gedrag opgemerkt, hoewel het wordt verwacht, maar ik kon daar geen documentatie voor vinden:
Voor Tomcat moet je Tomcat-fabriek definiëren (org.apache.tomcat.jdbc.pool.DataSourceFactory
of andere Tomcat-fabrieken), anders werkt het als Common DBCP.
Er zijn verschillen tussen de standaardwaarden van Common DBCP en Tomcat DBCP, met name testOnBorrow
(true
in Common DBCP maar false
in Tomcat DBCP ).
Antwoord 6, autoriteit 11%
Hier is een lijst met voordelen van het gebruik van Tomcat JDBC-pool in plaats van commons-dbcp: http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html