Kann jemand Beispiele oder Links zum Einrichten eines JDBC-Verbindungspools bereitstellen?
Bei der Suche in Google sehe ich viele verschiedene Möglichkeiten, dies zu tun, und es ist ziemlich verwirrend.
Letztendlich brauche ich den Code, um ein java.sql.Connection
Objekt zurückzugeben, aber ich habe Probleme beim Einstieg. Alle Vorschläge sind willkommen.
Update: Haben javax.sql
oder java.sql
haben Sie keine Verbindungsimplementierungen? Warum wäre es nicht am besten, diese zu verwenden?
Antworten:
Wenn Sie einen eigenständigen Verbindungspool benötigen, gehe ich lieber zu C3P0 als zu DBCP (das habe ich in dieser vorherigen Antwort erwähnt ). Ich hatte einfach zu viele Probleme mit DBCP unter hoher Last. Die Verwendung von C3P0 ist denkbar einfach. Aus der Dokumentation :
Wenn Sie jedoch auf einem Anwendungsserver ausgeführt werden, würde ich empfehlen, den darin enthaltenen integrierten Verbindungspool zu verwenden. In diesem Fall müssen Sie es konfigurieren (siehe Dokumentation Ihres Anwendungsservers) und eine DataSource über JNDI abrufen:
quelle
Wenn Sie einen Verbindungspool benötigen, schreiben Sie normalerweise eine Anwendung, die in einer verwalteten Umgebung ausgeführt wird, dh Sie werden auf einem Anwendungsserver ausgeführt. Überprüfen Sie in diesem Fall unbedingt, welche Verbindungspooling-Funktionen Ihr Anwendungsserver bereitstellt, bevor Sie andere Optionen ausprobieren.
Die sofort einsatzbereite Lösung lässt sich am besten in die übrigen Funktionen des Anwendungsservers integrieren. Wenn Sie jedoch nicht auf einem Anwendungsserver ausgeführt werden, würde ich die Apache Commons DBCP-Komponente empfehlen . Es ist weit verbreitet und bietet alle grundlegenden Pooling-Funktionen, die die meisten Anwendungen benötigen.
quelle
HikariCP
Es ist modern, es ist schnell, es ist einfach. Ich benutze es für jedes neue Projekt. Ich bevorzuge es viel gegenüber C3P0, kenne die anderen Pools nicht so gut.
quelle
Das Rad nicht neu erfinden.
Probieren Sie eine der sofort verfügbaren Komponenten von Drittanbietern aus:
Apache DBCP enthält ein anderes Beispiel zum Einrichten einer Pooling- Datei javax.sql.DataSource . Hier ist ein Beispiel , das Ihnen den Einstieg erleichtern kann.
quelle
disclecsia
habe mich besiegt. Sie können sehen, dass der Link korrekt ist. :)tomcat-jdbc
. Sie können es von Maven Central bekommen ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/…Ich würde empfehlen, die commons-dbcp- Bibliothek zu verwenden. Es sind zahlreiche Beispiele für die Verwendung aufgeführt. Hier ist der Link zum einfachen Verschieben . Die Verwendung ist sehr einfach:
Sie müssen die Datenquelle nur einmal erstellen. Lesen Sie daher unbedingt die Dokumentation, wenn Sie nicht wissen, wie das geht. Wenn Sie nicht wissen, wie Sie JDBC-Anweisungen richtig schreiben, damit keine Ressourcen verloren gehen, sollten Sie auch diese Wikipedia- Seite lesen .
quelle
javax.sql.DataSource
Definition der Schnittstelle enthält eine Implementierung von "Connection Pooling" (außerdem denke ich, dass Sie bereits wissen, was eine JDBC-Schnittstelle ist)Auf dem App-Server, den wir dort verwenden, wo ich arbeite (Oracle Application Server 10g, wie ich mich erinnere), wird das Pooling vom App-Server ausgeführt. Wir rufen eine
javax.sql.DataSource
mit einer JNDI-Suche mit a abjavax.sql.InitialContext
.es ist so etwas gemacht
(Wir haben diesen Code nicht geschrieben, er wurde aus dieser Dokumentation kopiert .)
quelle
Schwimmbad
performance
[Durch erneutes Verwenden derselben Objekte zum Ausführen von Aktionen für Objektdaten] undmemory
[Zuweisen und Aufheben der Zuweisung vieler Objekte führt zu einem erheblichen Speicherverwaltungsaufwand].«Pooling [
Object
Pool,String
konstanter Pool,Thread
Pool, Verbindungspool]String Konstanter Pool
Beispiel: Zeichenfolge zum Überprüfen des eindeutigen Objekts aus dem Pool.
Connection Pool Typ-4 mit Treiber mit 3rd - Party - Bibliotheken [
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
WikiBeim Verbindungspoolmechanismus werden beim Laden der Klasse die
physical JDBC connection
Objekte abgerufen und dem Benutzer ein umschlossenes physisches Verbindungsobjekt bereitgestellt.PoolableConnection
ist ein Wrapper um die eigentliche Verbindung.getConnection()
Wählen Sie eine der freien Wrapped -Verbindungen aus dem Verbindungsobjektpool aus und geben Sie sie zurück.close()
Anstatt zu schließen, wird die Wrapped-Verbindung wieder an den Pool zurückgegeben.Beispiel: Verwenden des ~ DBCP2-Verbindungspools mit Java 7 [
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
Webanwendung : Um Verbindungsprobleme zu vermeiden, wenn alle Verbindungen geschlossen sind [MySQL "wait_timeout" Standard 8 Stunden], um die Verbindung mit der zugrunde liegenden Datenbank wieder zu öffnen.
Sie können dies tun, um jede Verbindung zu testen, indem Sie testOnBorrow = true und validationQuery = "SELECT 1" setzen und autoReconnect für MySQL Server nicht verwenden, da es veraltet ist. Problem
Siehe auch diese:
quelle
public class StringPoolTest
nur hat 2 void Methoden, so dass sie nichts zurückgeben. Durchläuft dieser Code tatsächlich den Prozess der Verwaltung des Zeichenfolgenpools? Es scheint nicht einmal irgendwelche Argumente zu verwenden.s1
ist nicht definiert?ConnectionPool
Klasse zu sein. Vielen Dank.Ende 2017 sind Proxool, BoneCP, C3P0 und DBCP zu diesem Zeitpunkt größtenteils nicht mehr verfügbar. HikariCP (erstellt im Jahr 2012) scheint vielversprechend und sprengt die Türen von allem, was ich sonst noch weiß. http://www.baeldung.com/hikaricp
Proxool hat eine Reihe von Problemen:
- Unter hoher Last kann die maximale Anzahl von Verbindungen überschritten und nicht unter die maximale Anzahl zurückgegeben werden.
- Kann es schaffen, auch nach Ablauf der Verbindungen nicht zu minimalen Verbindungen zurückzukehren.
- Kann den gesamten Pool (und alle Server- / Client-Threads) sperren. Wenn während des HouseKeeper-Threads Probleme beim Herstellen einer Verbindung zur Datenbank auftreten (verwendet nicht .setQueryTimeout)
- Der HouseKeeper-Thread fordert den Prototyper-Thread auf, Verbindungen wiederherzustellen (Sweep), was zu Race Condition / Lockup führen kann. Bei diesen Methodenaufrufen sollte der letzte Parameter immer Sweep sein: false während der Schleife, nur Sweep: true darunter.
- HouseKeeper benötigt nur den einzelnen PrototypeController-Sweep am Ende und hat mehr [oben erwähnt]
- Der HouseKeeper-Thread prüft, ob Verbindungen getestet wurden, bevor festgestellt wird, welche Verbindungen möglicherweise abgelaufen sind [ein gewisses Risiko, abgelaufene Verbindungen zu testen, die durch andere Zeitüberschreitungen zur Datenbank in der Firewall unterbrochen / beendet werden können usw.]
- Das Projekt verfügt über unfertigen Code (definierte Eigenschaften) aber nicht bearbeitet )
- Die maximale Standardverbindungslebensdauer, falls nicht definiert, beträgt 4 Stunden (übermäßig)
- HouseKeeper-Thread wird alle fünf Sekunden pro Pool ausgeführt (übermäßig)
Sie können den Code ändern und diese Verbesserungen vornehmen. Da es 2003 erstellt und 2008 aktualisiert wurde, fehlen fast 10 Jahre Java-Verbesserungen, die Lösungen wie Hikaricp nutzen.
quelle
Wie von anderen beantwortet, werden Sie wahrscheinlich mit Apache Dbcp oder c3p0 zufrieden sein . Beide sind beliebt und funktionieren gut.
In Bezug auf Ihren Zweifel
Sie bieten keine Implementierungen, sondern Schnittstellen und einige Unterstützungsklassen, die nur den Programmierern zur Verfügung stehen, die Bibliotheken von Drittanbietern (Pools oder Treiber) implementieren. Normalerweise schaut man sich das gar nicht an. Ihr Code sollte die Verbindungen aus Ihrem Pool auf transparente Weise wie "einfache" Verbindungen behandeln.
quelle
Vibur DBCP ist eine weitere Bibliothek für diesen Zweck. Einige Beispiele zur Konfiguration für die Verwendung mit Hibernate, Spring + Hibernate oder programmgesteuert finden Sie auf der Website: http://www.vibur.org/
Siehe auch den Haftungsausschluss hier .
quelle
Apache Commons verfügt zu diesem Zweck über eine Bibliothek: DBCP . Wenn Sie keine seltsamen Anforderungen an Ihre Pools haben, würde ich eine Bibliothek verwenden, da diese zwangsläufig schwieriger und subtiler ist, als Sie es sich erhoffen würden.
quelle
Sie sollten die Verwendung von UCP in Betracht ziehen. Der Universal Connection Pool (UCP) ist ein Java-Verbindungspool. Es handelt sich um einen funktionsreichen Verbindungspool, der eng in die Real Application Clusters (RAC) -, ADG- und DG-Datenbanken von Oracle integriert ist.
Auf dieser Seite finden Sie weitere Informationen zu UCP.
quelle
MiniConnectionPoolManager
ist eine One-Java-Datei-Implementierung, wenn Sie nach einer einbettbaren Lösung suchen und sich nicht zu sehr um die Leistung sorgen (obwohl ich sie diesbezüglich nicht getestet habe).Es handelt sich um mehrfach lizenzierte EPL , LGPL und MPL .
Die Dokumentation enthält auch Alternativen, die es wert sind, überprüft zu werden (zusätzlich zu DBCP und C3P0):
quelle