/ / tomcat-dbcp vs commons-dbcp - java, apache-commons, apache-commons-dbcp

tomcat-dbcp vs commons-dbcp - java, apache-commons, apache-commons-dbcp

Sembra che ci sia molta confusione tra queste due librerie di pool di connessioni. Quello che voglio sapere è quale è meglio (se non del tutto)?

Ecco alcuni punti che vorrei mettere su ... Qualcuno potrebbe verificare per favore?

  1. Tomcat DBCP: utilizza il predefinito tomcat-dbcp.jar che sarà presente nella directory tomcat / lib. tu non hai bisogno di librerie commons-dbcp.jar o commons-pool.jar nel tuo web-inf / lib. Il driver DB deve essere inserito in tomcat / lib.

  2. La classe di origine dati DBC Tomcat è org.apache.tomcat.dbcp.dbcp.BasicDataSource. La classe di origine dati DBCP di Commons è org.apache.commons.dbcp.BasicDataSource.

  3. L'unica differenza tra questi due può essere trovata in questo blog. Non so se l'informazione è corretta o meno.

  4. La documentazione ufficiale di Tomcat indica chiaramente che la maggior parte delle classi è stata appena ribattezzata e reimballata.

Quindi la domanda è: quale usare e quale è meglio?

risposte:

32 per risposta № 1

Tomcat DBCP è solo una versione rinominata di Apache Commons DBCP, con anche un prefisso del nome del pacchetto interno diverso.

Al momento della compilazione, Tomcat recupera i sorgenti DBCP di Commons (la versione dipende dalla versione di Tomcat, ad esempio Tomcat 7.0.27 utilizza Commons DBCP 1.4) e sostituisce il nome del pacchetto (org.apache.commons -> org.apache.tomcat.dbcp) e costruisce il risultato come tomcat-dbcp.jar.

Questo viene fatto in modo che i pool JDBC Tomcat interni non siano mai in conflitto con i possibili usi delle applicazioni delle classi DBCP di Commons. Ciò evita molti potenziali problemi di classloading.

Modificare: I pacchetti "dbcp" riguardano la gestione delle origini dati. Per l'implementazione del pool puro, Commons DBCP dipende da Commons Pool (pacchetto org.apache.commons.pool), ma in Tomcat l'implementazione del pool viene sostituita con quella di Tomcat Pool JDBC (pacchetto org.apache.tomcat.jdbc.pool).


13 per risposta № 2

Sembra che ci sia molta confusione tra queste due librerie di pool di connessioni. Quello che voglio sapere è quale è meglio (se non del tutto)?

TL / DR: questi sono gli stessi, non usare nessuno dei due.

Tomcat-dbcp è il nuovo pacchetto originale del pool di apache comuni incluso nella distribuzione di Tomcat. Per evitare che il pacchetto di clash della classe sia stato rinominato in org.apache.tomcat.dbcp.dbcp. *

In Tomcat 7 (a partire da 7.0.19 luglio 2011) un pacchetto di connessione aggiuntivo è stato incluso nel pacchetto Tomcat predefinito (come parte di tomcat-jdbc.jar) in alternativa all'implementazione di apache commons stantie, denominato "Il pool di connessioni JDBC Tomcat":

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

Questo articolo copre le differenze tra i due:

http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html

Breve riassunto perché il nuovo pool Tomcat è migliore:

  • attivamente supportato
  • molto più piccolo, più facile da capire e da mantenere (se ti interessa guardare alla fonte)
  • supporta tutte le funzioni commons-dbcp + aggiunge quelle super utili come "initSQL", "validationInterval", "jdbcInterceptors" e altro

11 per risposta № 3

Versioni precedenti di Apache Commons DBCP (ad es. versione 1.2) ha avuto alcuni problemi di sicurezza del thread in condizioni di carico elevato, rendendolo inadatto per questo tipo di utilizzo. Non mi sorprende che la gente di Tomcat abbia rielaborato il problema per risolvere questi problemi.

Tuttavia, la mia comprensione è che Commons DBCP 1.4 risolve questi problemi. Non posso confermarlo personalmente, ma potrebbe rendere ridondante la versione di Tomcat.

È interessante notare che SpringSource ha anche riscritto il DBCP di Commons per la versione riconfezionata di Tomcat (tc-Server), e rivendicano grossi vantaggi in termini di prestazioni. Tuttavia, non hanno aperto questo.


6 per risposta № 4

Tomcat 7 continua a utilizzare DBCP. Il motivo principale potrebbe essere nascosto nei loro documenti Tomcat:

  • È possibile configurare il DBCP di Apache Commonsrintracciare e recuperare questi connessioni database abbandonate. Non solo può recuperarli, ma anche genera una traccia di stack per il codice che ha aperto queste risorse e mai chiuso.

  • Tomcat jdbc-pool library, forse più veloce in altascenari simultanei ma non possono chiudere e rilasciare automaticamente le dichiarazioni (che uno sviluppatore ha dimenticato di chiudere) possibili perdite di memoria in alcuni driver jdbc.

Tuttavia uno dei problemi con il codice DBCP è ilmodello di delega che usano, attualmente le loro ultime versioni supportano JDK1.6 e versioni precedenti. Sostenere 1.7 significa cambiare almeno un quarto delle loro classi, che è stato uno dei motivi per cui la libreria del pool JDBC è nata.

NOTA: dopo ulteriori indagini, il pool JDBC ha un modo per chiudere le dichiarazioni di apertura quando viene chiusa una connessione, utilizzando a StatementFinalizer intercettore.


4 per risposta № 5

Ecco un elenco dei vantaggi dell'utilizzo del pool JDBC di Tomcat anziché di commons-dbcp: http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html


3 per risposta № 6

Solo per aggiungere qui: Ho notato un comportamento interessante, sebbene sia previsto ma non è stato possibile trovare alcuna documentazione per questo:

Per Tomcat è necessario definire la fabbrica Tomcat (org.apache.tomcat.jdbc.pool.DataSourceFactory o altre fabbriche Tomcat) altrimenti funzionerà come DBCP comune.

Esistono differenze tra i valori predefiniti di DBCP comune e Tomcat DBCP, in particolare testOnBorrow (true in DBCP comune ma false in Tomcat DBCP).