tomcat-dbcp vs commons-dbcp

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?

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

  2. Tomcat DBCP-gegevensbronklasse is org.apache.tomcat.dbcp.dbcp.BasicDataSource.
    Commons DBCP-gegevensbronklasse is org.apache.commons.dbcp.BasicDataSource.

  3. Het enige verschil tussen deze twee is te vinden in deze blog. Weet niet of de informatie juist is of niet.

  4. 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.DataSourceFactoryof andere Tomcat-fabrieken), anders werkt het als Common DBCP.

Er zijn verschillen tussen de standaardwaarden van Common DBCP en Tomcat DBCP, met name testOnBorrow(truein Common DBCP maar falsein 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

Other episodes