2009-01-29 8 views
14

Die JDBC 3.0-Spezifikation spricht über das Pooling (und Prepared Statement) -Pooling.Ist DBCP (Apache Commons Datenbankverbindungspooling) noch relevant?

Wir haben mehrere Standalone-Java-Programme (d. H. Wir verwenden keinen Anwendungsserver), die DBCP zum Bereitstellen von Verbindungspooling verwendet haben. Sollten wir weiterhin DBCP verwenden, oder können wir das von JDBC bereitgestellte Pooling nutzen und DBCP loswerden?

Wir verwenden MySQL (Connector/J) und werden eventuell SQL Server-Unterstützung (jTDS) hinzufügen; Es ist unwahrscheinlich, dass wir andere Datenbanken unterstützen.

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

Antwort

13

Basierend auf der Ermutigung von anderen Plakaten versuchte ich DBCP zu eliminieren und den MySQL JDBC Treiber direkt zu verwenden (Connector/J 5.0.4). Ich war dazu nicht in der Lage.

Es scheint, dass, während der Treiber eine Grundlage für das Pooling bietet, es nicht die wichtigste Sache bietet: ein tatsächlicher Pool (der Quellcode war dafür praktisch). Es ist dem Anwendungsserver überlassen, diesen Teil bereitzustellen.

Ich schaute noch einmal auf die JDBC 3.0-Dokumentation (ich habe eine gedruckte Kopie von etwas mit der Bezeichnung "Chapter 11 Connection Pooling", nicht sicher, wo genau es herkam) und ich kann sehen, dass der MySQL-Treiber dem JDBC-Dokument folgt .

Wenn ich DBCP ansehe, beginnt diese Entscheidung sinnvoll. Ein gutes Pool-Management bietet viele Optionen. Zum Beispiel, wenn Sie nicht verwendete Verbindung löschen? Welche Verbindungen löschst du? 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 einem Anrufer geben?usw.

Zusammenfassung: Wenn Sie eine eigenständige Java-Anwendung ausführen, müssen Sie eine Verbindungspooling-Bibliothek verwenden. Verbindungspooling-Bibliotheken sind weiterhin relevant.

0

Leute benutzen immer noch DBCP, ich denke, es kommt sogar als Standard mit Hibernate.

Erfüllt DBCP Ihre aktuellen Anforderungen nicht?

Ich bin kein großer Gläubiger beim Ersetzen der Infrastruktur, es sei denn, es gibt bereits eine Leistungs- oder Funktionslücke, die es nicht füllen kann, auch wenn es neuere oder schickere Alternativen gibt.

+0

DBCP funktioniert, aber wenn ich die gleichen Funktionen vom JDBC-Treiber bekommen kann, würde ich genauso schnell Dinge vereinfachen. Es würde mir auch nichts ausmachen, den Code zu entfernen, den wir hinzugefügt haben, um die DBCP-Ausnahmebehandlung zu "reparieren". – jdigital

+1

c3p0 kommt mit Hibernate. –

1

Ich bevorzuge dbcp oder c3p0, weil sie herstellerneutral sind. Ich habe herausgefunden, zumindest mit mysql oder oracle, dass, wann immer ich etwas mit dem jdbc-Client zu tun habe, der kein Standard-SQL ist, ich eine Kompilierzeitabhängigkeit von den Klassen des Herstellers einführen muss. Siehe zum Beispiel ein sehr nerviges Beispiel here.

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

+0

Der Thread - Sie zur Verfügung gestellt - ist nicht relevant, fürchte ich. –

+0

Ich weiß. Ich habe darauf Bezug genommen, um zu illustrieren, was ich mit Kompilierabhängigkeiten meinte. – Yoni

7

DBCP hat schwerwiegende Fehler. Ich denke nicht, dass es für eine Produktionsanwendung geeignet ist, besonders wenn so viele Treiber das Pooling in ihrem DataSource nativ unterstützen.

Der Strohhalm, der das Fass zum Überlaufen brachte, war in meinem Fall, als ich feststellte, dass der gesamte Pool während der gesamten Zeit gesperrt war, als ein neuer Verbindungsversuch zur Datenbank gemacht 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 — herzustellen, obwohl sie eine Datenbank verwenden.

Pools sollen die Leistung verbessern, nicht verschlechtern. DBCP ist naiv, kompliziert und veraltet.

+0

Wie viel Aufwand ist es, von DBCP zu JDBC-Pooling zu wechseln? – jdigital

+0

Es hängt vom Treiber 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. – erickson

+2

Ich würde zustimmen, dass DBCP gebrochen ist. Wir wechselten zu C3PO und es funktionierte wie ein Traum –