14 Stimmen

Ist DBCP (Apache Commons Database Connection Pooling) noch aktuell?

Die JDBC 3.0-Spezifikation spricht von Connection (und Prepared Statement) Pooling.

Wir haben mehrere eigenständige Java-Programme (d.h. wir verwenden keinen Anwendungsserver), die DBCP für das Pooling von Verbindungen verwendet haben. Sollten wir DBCP weiterhin verwenden, oder können wir die Vorteile des JDBC-Pooling nutzen und DBCP abschaffen?

Wir verwenden MySQL (Connector/J) und werden in Zukunft auch SQL Server unterstützen (jTDS); es ist unwahrscheinlich, dass wir andere Datenbanken unterstützen werden.

EDIT: Siehe Kommentar unten über meinen Versuch, die Verbindungspooling-Bibliothek zu beseitigen. Es scheint, dass DBCP immer noch relevant ist (beachten Sie, dass einige Kommentatoren C3P0 gegenüber DBCP empfohlen haben).

13voto

jdigital Punkte 11626

Aufgrund der Ermutigung anderer Poster habe ich versucht, DBCP zu eliminieren und den MySQL JDBC-Treiber direkt zu verwenden (Connector/J 5.0.4). Dies ist mir nicht gelungen.

Es hat den Anschein, dass der Treiber zwar eine Grundlage für das Pooling bietet, aber nicht das Wichtigste: einen tatsächlichen Pool (der Quellcode war hier sehr hilfreich). Es bleibt dem Anwendungsserver überlassen, diesen Teil bereitzustellen.

Ich habe noch einmal einen Blick in die JDBC 3.0-Dokumentation geworfen (ich habe eine gedruckte Kopie von etwas mit der Bezeichnung "Kapitel 11 Connection Pooling", ich weiß nicht genau, woher sie stammt) und ich kann sehen, dass der MySQL-Treiber dem JDBC-Dokument folgt.

Wenn ich mir DBCP ansehe, ergibt diese Entscheidung einen Sinn. Ein gutes Poolmanagement bietet viele Möglichkeiten. Zum Beispiel, wann werden ungenutzte Verbindungen gelöscht? welche Verbindungen werden gelöscht? gibt es eine harte oder weiche Grenze für die maximale Anzahl von Verbindungen im Pool? sollten Sie eine Verbindung auf "Lebendigkeit" testen, bevor Sie sie an einen Anrufer weitergeben? usw.

Zusammenfassung: Wenn Sie eine eigenständige Java-Anwendung erstellen, müssen Sie eine Bibliothek für das Connection Pooling verwenden. Verbindungspooling-Bibliotheken sind immer noch relevant.

7voto

erickson Punkte 256579

DBCP hat schwerwiegende Mängel. Ich glaube nicht, dass es für eine Produktionsanwendung geeignet ist, besonders wenn so viele Treiber Pooling in ihren DataSource nativ.

Der Tropfen, der das Fass zum Überlaufen brachte, war in meinem Fall, als ich feststellte, dass der gesamte Pool die ganze Zeit gesperrt war, wenn eine neue Verbindung zur Datenbank hergestellt wurde. Wenn also etwas mit Ihrer Datenbank passiert, das zu langsamen Verbindungen oder Timeouts führt, werden andere Threads blockiert, wenn sie versuchen, eine Verbindung zum Pool zurückzugeben - obwohl sie eine Datenbank verwenden.

Pools sind dazu gedacht, die Leistung zu verbessern, nicht sie zu verschlechtern. DBCP ist naiv, kompliziert und veraltet.

0 Stimmen

Wie groß ist der Aufwand für den Wechsel von DBCP zu JDBC-Pooling?

0 Stimmen

Das hängt vom Fahrer ab. Bei Oracle und PostgresQL war es eine einfache Konfigurationsänderung - der Code arbeitete bereits mit einer (DBCP) DataSource. Ich habe keine Erfahrung mit MySQL-Treibern.

2 Stimmen

Ich stimme zu, dass DBCP kaputt ist. Wir wechselten zu C3PO und es funktionierte wie ein Traum

1voto

Yoni Punkte 9949

Ich bevorzuge die Verwendung von dbcp oder c3p0, weil sie herstellerneutral sind. Ich habe herausgefunden, zumindest mit mysql oder oracle, dass ich jedes Mal, wenn ich versuche, etwas mit dem jdbc-Client zu tun, das nicht Standard-SQL ist, eine Kompilierzeit-Abhängigkeit von den Klassen des Anbieters einführen muss. Siehe zum Beispiel ein sehr ärgerliches Beispiel aquí .

Ich bin nicht sicher, über mysql, aber Oracle verwendet ihre spezifischen, Nicht-Standard-Klassen für Connection Pooling.

0 Stimmen

Ich weiß. Ich habe mich darauf bezogen, um zu verdeutlichen, was ich mit den Kompilierabhängigkeiten meinte.

0voto

Uri Punkte 86472

DBCP wird nach wie vor verwendet, ich glaube, es ist sogar standardmäßig in Hibernate enthalten.

Entspricht DBCP nicht Ihren aktuellen Bedürfnissen?

Ich halte nicht viel davon, die Infrastruktur zu ersetzen, es sei denn, es gibt bereits eine Leistungs- oder Funktionslücke, die sie nicht füllen kann, selbst wenn es neuere oder bessere Alternativen gibt.

0 Stimmen

DBCP funktioniert, aber wenn ich die gleichen Funktionen aus dem JDBC-Treiber erhalten kann, würde ich die Dinge genauso gut vereinfachen. Es würde mir auch nichts ausmachen, einen Teil des Codes zu entfernen, den wir hinzugefügt haben, um die DBCP-Ausnahmebehandlung zu "reparieren".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X