Ich habe JDBC in JavaSE immer in einer Single-Thread-Umgebung verwendet. Aber jetzt muss ich einen Verbindungspool verwenden und viele Threads mit der Datenbank interagieren lassen (MSSQL und Oracle) und es fällt mir schwer, es zu versuchen, da es mir an fundamentaler Unerschütterlichkeit der API mangelt / p>
AFAIK nach dem Verbinden und Protokollieren von Connection
stellt eine physische tcp / ip-Verbindung zur Datenbank dar. Es erstellt Statement
(s), die als SQL-Interaktion (en) mit der Datenbank über Connection
betrachtet werden können.
Connection
oder Statement
. Connection
N Anweisungen erstellt und sie an verschiedene Threads weitergibt, damit jeder die Statement
benutzen kann? Wenn nicht, und nach dem Konfigurieren des Pools etwa so:
%Vor%BTW, wo stelle ich die Größe des Verbindungspools ein?
Würde ich das in jedem Thread tun, um die Verbindung korrekt zu nutzen?
// thead run-Methode
%Vor%// Ende der Thread-Laufmethode
Vielen Dank und verzeih mir mein schlechtes Englisch.
Verbindungspools dekorieren Connection- und Statement-Instanzen mit eigenen Wrapper-Implementierungen. Wenn Sie eine Verbindung schließen, geben Sie sie gerade zurück in den Pool. Wenn Sie eine vorbereitete Anweisung schließen, geben Sie sie gerade wieder in den Anweisungscache der Verbindung zurück. Wenn Sie eine Anweisung vorbereiten, holen Sie möglicherweise nur eine zwischengespeicherte Anweisungsinstanz aus der Verbindung ab. All dies ist nicht sichtbar, so dass Sie sich keine Sorgen machen müssen.
Wenn eine Verbindung zu einem Client hergestellt wird, steht sie keinem anderen Client mehr zur Verfügung, bis die Verbindung zum Pool freigegeben wird. Im Allgemeinen rufen Sie nur Verbindungen ab, wenn Sie sie benötigen, und geben sie dann zurück, sobald Sie mit ihnen fertig sind. Da die Verbindungen im Pool offen gehalten werden, ist der Aufwand beim Abrufen und Freigeben von Verbindungen gering.
Sie sollten eine Verbindung aus dem Pool genauso wie eine einzelne JBDC-Verbindung verwenden und die Best Practices für das Schließen von Ressourcen befolgen, damit keine Verbindungen oder Anweisungen verloren gehen. Sehen Sie sich die Beispiele try / catch / finally in einigen anderen Antworten an.
Pools können die Verbindungsressourcen verwalten und sie testen, bevor sie an Clients verteilt werden, um sicherzustellen, dass sie nicht veraltet sind. Ein Pool erstellt und zerstört Verbindungen nach Bedarf.
Wenn Sie JDBC mit Single-Threading beherrschen, sollten Sie keine Multi-Threading- und Verbindungspools verwenden. Alles, was Sie anders machen müssen, ist: 1. Wenn Sie eine Verbindung benötigen, holen Sie sie aus dem Pool statt direkt. 2. Jeder Thread sollte seine eigenen Verbindungen bekommen.
Um Punkt 2 zu verdeutlichen: Wenn Sie eine Verbindung erhalten und sie dann an mehrere Threads übergeben, könnten Sie zwei Threads haben, die versuchen, Abfragen für dieselbe Verbindung gleichzeitig auszuführen. Java wird Ausnahmen davon auslösen. Sie können nur eine aktive Anweisung pro Verbindung und eine aktive Abfrage (d. H. ResultSet) pro Anweisung haben. Wenn zwei Threads das gleiche Connection-Objekt enthalten, verletzen sie diese Regel wahrscheinlich sofort.
Eine weitere Einschränkung: Achten Sie beim Verbindungs-Pooling darauf, Ihre Verbindungen immer zu schließen, wenn Sie fertig sind. Der Pool-Manager hat keine definitive Möglichkeit zu wissen, wann Sie eine Verbindung fertig haben. Wenn Sie also keine Verbindung herstellen können, wird es lange Zeit dort hängen bleiben, möglicherweise für immer, abhängig vom Pool-Manager. Ich folge immer immer jeder "getConnection" mit einem try-Block und schließe die Verbindung im finally-Block. Dann weiß ich, dass ich es geschlossen habe, bevor die Funktion beendet wird.
Außerdem sollte alles so sein, wie Sie es gewohnt sind.
Transaktionen finden auf der Verbindungsebene statt.
Nein. Normalerweise stellt der JDBC-Treiber sicher, dass Sie keine zweite Anweisung über dieselbe Verbindung ausführen können, während eine andere aktiv ist.
Wenn Sie Verbindungspooling benötigen, versuchen Sie das DBCP-Framework . Es bietet ziemlich anständige Fehlerbehandlung (wie veraltete Verbindungen und Verbindungen, die vom Client-Code nicht zurückgegeben wurden).
Wie für Ihren Code: Umschließen Sie den Code immer in try{...}finally{...}
:
Dieser Code stellt sicher, dass alle Verbindungen usw. immer korrekt geschlossen sind und dass jede Ausnahme beim Schließen keinen vorherigen Fehler verdeckt.
Ich denke, Sie sollten mit dem Sun Tutorial zum Verbindungs-Pooling beginnen. Darüber hinaus gibt es viele Implementierungen von Verbindungspooling, einige Open Source, einschließlich eines von Apache . Sie sollten wirklich dort anfangen, anstatt das Rad hier neu zu erfinden.
Sie können nur eine Anweisung für eine bestimmte Verbindung geöffnet lassen. Das Erstellen von mehr als einer Verbindung über einen Verbindungspool ist nicht so schwierig, obwohl die beste Möglichkeit darin besteht, eine der größeren Verbindungen dort zu verwenden.
Wenn Sie den Standard-JDBC-Standard verwenden, empfehle ich PreparedStatement over Statement.
Ich habe iBatis benutzt und es ist ziemlich nett. Bringt noch ein paar andere Dinge auf den Tisch.
Zusätzliche Bits:
Anwendungsserver neigen dazu, Verbindungspooling bereitzustellen, und es kann ziemlich clever werden. Wenn Sie einen App-Server verwenden, untersuchen Sie sorgfältig, was Sie auspacken, bevor Sie etwas Eigenes hinzufügen.
Transaktionen: wenn Sie
habenBeginne die Transaktion
Verbindung erhalten Arbeit close connection // bedeutet Rückkehr zum Pool
Verbindung herstellen (mit gleicher Isolationsstufe usw.)
// Sie erhalten eine SAME Verbindung, der Pool reserviert sie für Ihre Transaktion
Arbeit // passiert in der gleichen Transaction Verbindung schließen
Commit-Transaktion // schreibt die gesamte Arbeit fest
Verbindungen und Fehler
Poolimplementierungen können schlau sein. Wenn bei einer Verbindung aus dem Pool bestimmte Fehler auftreten, die darauf hinweisen, dass der DB-Server zurückgewiesen wurde, kann der Pool auswählen, alle Pool-Mitglieder zu verwerfen.
Tags und Links java multithreading oracle connection-pooling jdbc