wake-up-neo.net

Verbindungspooling-Optionen mit JDBC: DBCP vs. C3P0

Was ist die beste Verbindungspoolbibliothek, die für Java/JDBC verfügbar ist?

Ich überlege mir die 2 Hauptkandidaten (frei/Open Source): 

Ich habe viel darüber in Blogs und anderen Foren gelesen, konnte aber keine Entscheidung treffen.

Gibt es relevante Alternativen zu diesen beiden?

305
Dema

DBCP ist veraltet und kein Produktionsgrad. Vor einiger Zeit haben wir eine In-House-Analyse der beiden durchgeführt und ein Testgerät erstellt, das Last und Parallelität mit den beiden erzeugte, um deren Eignung unter realen Bedingungen zu beurteilen. 

DBCP generierte konsequent Ausnahmen in unserer Testanwendung und bemühte sich, Leistungsniveaus zu erreichen, die C3P0 ausnahmslos bewältigen konnte. 

C3P0 handhabte auch robust die DB-Unterbrechungen und transparente Wiederverbindungen beim Fortsetzen, wohingegen DBCP niemals Verbindungen wiederhergestellt hat, wenn die Verbindung darunter entfernt wurde. Noch schlimmer war, dass DBCP Connection-Objekte an die Anwendung zurückbrachte, für die der zugrunde liegende Transport beschädigt wurde. 

Seitdem haben wir C3P0 in 4 großen, stark beanspruchten Web-Apps für Privatanwender eingesetzt und haben nie zurückgeschaut.

UPDATE: Es stellt sich heraus, dass die Leute von Apache Commons nach jahrelangem Sitzen auf einem Regal DBCP aus der Ruhephase genommen haben und es ist jetzt wieder ein aktiv entwickeltes Projekt. Daher ist mein ursprünglicher Beitrag möglicherweise nicht mehr aktuell. 

Davon abgesehen habe ich die Leistung dieser neuen verbesserten Bibliothek noch nicht erlebt, und ich habe noch nicht gehört, dass sie in einem der letzten App-Frameworks de-facto ist.

176
j pimmel

Ich lade Sie ein, BoneCP - auszuprobieren, es ist kostenlos, Open Source und schneller als die verfügbaren Alternativen (siehe Benchmark-Abschnitt).

Haftungsausschluss: Ich bin der Autor, also könnte man sagen, ich bin voreingenommen :-)

UPDATE: Stand März 2010 immer noch etwa 35% schneller als der neu geschriebene Apache DBCP-Pool ("Tomcat jdbc"). Siehe dynamischer Benchmark-Link im Benchmark-Abschnitt.

Update Nr. 2: (Dez '13) Nach vier Jahren an der Spitze gibt es jetzt einen viel schnelleren Konkurrenten: https://github.com/brettwooldridge/HikariCP

Update Nr. 3: (Sep '14) Bitte beachten Sie, dass BoneCP an dieser Stelle deprecated ist, empfehlen Sie den Wechsel zu HikariCP .

Update Nr. 4: (April '15) - Ich besitze nicht mehr die Domäne jolbox.com, aber der neue Besitzer hat den alten Inhalt beibehalten.

171
wwadge

Ich hatte Probleme mit DBCP, als die Verbindungen die Zeit überschritten haben, also habe ich c3p0 getestet. Ich wollte dies für die Produktion freigeben, begann dann jedoch mit den Leistungstests. Ich fand, dass c3p0 eine schreckliche Leistung zeigte. Ich konnte es nicht so konfigurieren, dass es überhaupt eine gute Leistung bringt. Ich fand es doppelt so langsam wie DBCP.

Ich habe dann versucht das Tomcat Connection Pooling .

Dies war doppelt so schnell wie bei c3p0 und andere Probleme, die ich mit DBCP hatte, wurden behoben. Ich habe viel Zeit damit verbracht, die drei Pools zu untersuchen und zu testen. Bei der Bereitstellung für Tomcat empfiehlt es sich, den neuen Tomcat-JDBC-Pool zu verwenden.

16
user542651

Wurde bei der automatischen Wiederherstellung der Verbindung mit DBCP versucht, die folgenden zwei Konfigurationsparameter zu verwenden?

validationQuery="Some Query"

testOnBorrow=true
14
Brandon Teo

Verwenden Sie DBCP seit einigen Jahren in der Produktion. Es ist stabil, übersteht den Neustart des DB-Servers. Konfigurieren Sie es einfach richtig. Es müssen nur einige Parameter angegeben werden, damit Sie nicht faul sind. Hier ist ein Ausschnitt aus unserem Systemproduktionscode, der Parameter auflistet, die wir explizit festlegen, damit es funktioniert:

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");
12
oᴉɹǝɥɔ

Eine andere Alternative ist HikariCP .

Hier ist der Vergleich Benchmark

11
Kunal

Hier einige Artikel, die zeigen, dass DBCP eine deutlich höhere Leistung als C3P0 oder Proxool aufweist. Auch in meiner eigenen Erfahrung hat c3p0 einige Nice-Funktionen, wie etwa das Prepooled Statement Pooling, und ist konfigurierbarer als DBCP, aber DBCP ist in jeder Umgebung, in der ich es verwendet habe, eindeutig schneller.

Unterschied zwischen dbcp und c3p0? Absolut gar nichts! (Ein Sakai-Entwicklerblog) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

Siehe auch den JavaTech-Artikel "Connection Pool Showdown" in den Kommentaren des Blogbeitrags.

8
user187702

Leider sind sie alle veraltet. DBCP wurde vor kurzem etwas aktualisiert, die anderen beiden sind 2-3 Jahre alt, mit vielen ausstehenden Fehlern.

7
mjb

Dbcp ist bei richtiger Konfiguration produktionsbereit.

Es wird beispielsweise auf einer Commerce-Website mit 350000 Besuchern/Tag und mit Pools von 200 Verbindungen verwendet.

Es verarbeitet sehr gut Timeouts, sofern Sie es richtig konfigurieren.

Die Version 2 ist im Fortschritt und hat einen Hintergrund, der sie seit vielen Jahren zuverlässig macht. Produktionsprobleme wurden angegangen.

Wir verwenden es für unsere Batch-Server-Lösung und es wurden Hunderte von Batches ausgeführt, die in Millionen von Zeilen in der Datenbank funktionieren.

Leistungstests, die vom Tomcat-jdbc-Pool ausgeführt werden, zeigen, dass er eine bessere Leistung als cp30 aufweist.

7
UBIK LOAD PACK

Eine andere Alternative, Proxool, wird in diesem Artikel erwähnt.

Möglicherweise können Sie herausfinden, warum Hibernate c3p0 für die Implementierung des Standardverbindungspools bündelt.

7
toolkit

Ich habe es geschafft, anderthalb Tage mit DBCP zu verschwenden. Obwohl ich die neueste DBCP-Version verwende, bin ich auf die gleichen Probleme gestoßen wie j pimmel . Ich würde DBCP überhaupt nicht empfehlen, vor allem, wenn man die Datenbank aus dem Pool entfernt, wenn die DB nicht mehr vorhanden ist, die Verbindung nicht wiederhergestellt werden kann und es nicht möglich ist, Verbindungsobjekte dynamisch wieder in den Pool einzufügen ein Post-JDBCconnect-E/A-Socket lesen)

Ich wechsle jetzt zu C3P0. Ich habe das in früheren Projekten verwendet und es funktionierte wie ein Zauber.

4
Larry H

c3p0 ist gut, wenn wir Mutithreading-Projekte verwenden. In unseren Projekten verwendeten wir gleichzeitig mehrere Thread-Ausführungen unter Verwendung von DBCP, und dann kam es zu Verbindungszeitüberschreitungen, wenn wir mehr Thread-Ausführungen verwendeten. Also haben wir uns für die Konfiguration von c3p0 entschieden.

4
nns

Eine gute und einfach zu verwendende Alternative ist DBPool

"Ein Java-basiertes Datenbank-Pooling-Dienstprogramm, das zeitbasiertes Verfallsdatum, Anweisungszwischenspeicherung, Verbindungsvalidierung und einfache Konfiguration mithilfe eines Pool-Managers unterstützt."

http://www.snaq.net/Java/DBPool/

3
Soundlink

Wir sind auf eine Situation gestoßen, in der wir einen Verbindungspool einführen mussten, und wir hatten 4 Optionen vor uns.

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

Wir haben einige Tests und Vergleiche basierend auf unseren Kriterien durchgeführt und beschlossen, uns für HikariCP zu entscheiden. Lesen Sie diesen Artikel .

2
Jeevan Patil

Um den C3P0 am besten zu implementieren, dann überprüfe diese Antwort

C3P0:

Für Unternehmensanwendungen ist C3P0 der beste Ansatz. C3P0 ist eine benutzerfreundliche Bibliothek zum Erweitern herkömmlicher (DriverManager-basierter) JDBC-Treiber mit JNDI-bindbaren DataSources, einschließlich DataSources, die Connection und Statement Pooling implementieren, wie in der jdbc3-Spezifikation und der jdbc2 std-Erweiterung beschrieben. .C3P0 handhabte auch die DB-Unterbrechungen und transparente Wiederverbindungen beim Fortsetzen auf robuste Weise, wohingegen DBCP niemals Verbindungen wiederhergestellt hat, wenn die Verbindung unter ihm entfernt wurde. 

Aus diesem Grund haben c3p0 und andere Verbindungspools auch Anweisungscaches vorbereitet. Dadurch kann der Anwendungscode all dies vermeiden. Die Anweisungen werden normalerweise in einem begrenzten LRU-Pool aufbewahrt, sodass häufige Anweisungen eine PreparedStatement-Instanz wiederverwenden.

Noch schlimmer war es, dass DBCP Connection-Objekte an die Anwendung zurückbrachte, für die der zugrunde liegende Transport beschädigt war .. Ein üblicher Anwendungsfall für c3p0 ist das Ersetzen des in Apache Tomcat enthaltenen standardmäßigen DBCP-Verbindungspoolings. Ein Programmierer wird häufig in eine Situation geraten, in der Verbindungen nicht ordnungsgemäß im DBCP-Verbindungspool wiederverwendet werden und c3p0 in diesem Fall ein wertvoller Ersatz ist.

In aktuellen Updates verfügt C3P0 über einige hervorragende Funktionen. die sind unten angegeben:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

Max und min poolsize definieren hier Verbindungsgrenzen, dh wie viele und wie viele Verbindungen diese Anwendung benötigt. MaxIdleTime() legt fest, wann die Verbindung unterbrochen wird.

DBCP:

Dieser Ansatz ist auch gut, hat jedoch einige Nachteile wie Verbindungszeitüberschreitung und Verbindungsrealisierung. C3P0 ist gut, wenn wir Mutithreading-Projekte verwenden. In unseren Projekten verwendeten wir gleichzeitig mehrere Thread-Ausführungen unter Verwendung von DBCP, und dann kam es zu Verbindungszeitüberschreitungen, wenn wir mehr Thread-Ausführungen verwendeten. Also haben wir uns für die Konfiguration von c3p0 entschieden. Ich würde DBCP überhaupt nicht empfehlen, vor allem wenn man Verbindungen aus dem Pool wirft, wenn die Datenbank wegfällt, die Verbindung nicht wiederhergestellt werden kann, wenn die Datenbank zurückkehrt, und es nicht möglich ist, Verbindungen dynamisch hinzuzufügen Objekte zurück in den Pool (es hängt für immer an einem Post-JDBCconnect-E/A-Socket-Read)

Vielen Dank :)

0

meine empfehlung ist

hikari> druid> UCP> c3p0> DBCP

Es basiert auf dem, was ich getestet habe - 20190202, in meiner lokalen Testumgebung (4 GB mac/mysql im Docker/Pool minSize = 1, maxSize = 8). Hikari kann 1024 Threads x 1024-mal zur Verbindung von Verbindungen bereitstellen, durchschnittliche Zeit für jeden Thread Das Ende ist 1 oder 2 Millionen Sekunden, während c3p0 nur 256 Threads x 1024-mal liefern kann und die durchschnittliche Zeit für jeden Thread bereits 21 Millionen Sekunden beträgt. (512 Threads sind fehlgeschlagen).

0
Kyle Zhang