Frage

Ich habe ein Java-Programm, bestehend aus etwa 15 Methoden. während der exeuction des Programms und erhalten diese Methoden sehr häufig aufgerufen. Im Moment bin ich die Schaffung eine neue Verbindung in jeder Methode und Aufrufe Aussagen auf sie (Database-Setup auf einem anderen Rechner im Netzwerk).

Was ich möchte wissen, ist: Soll ich nur eine Verbindung im Hauptverfahren und gebe es als Argument für alle Methoden, die ein Verbindungsobjekt benötigen, da sie deutlich die Anzahl der Verbindungen Objekt im Programm reduzieren würden, statt der Schaffung und Verbindungen schließen sehr häufig in jeder Methode.

Ich vermute, ich bin nicht die Ressourcen sehr effizient mit dem aktuellen Design, und es gibt eine Menge Spielraum für Verbesserungen, wenn man bedenkt, dass dieses Programm könnte eine Menge in der Zukunft wachsen.

War es hilfreich?

Lösung

Ja, sollten Sie erneut mit Verbindungen anstatt einem neuen jedes Mal zu schaffen. Das übliche Verfahren ist:

  • etwas erraten, wie viele gleichzeitige Verbindungen Ihrer Datenbank sinnvoll verarbeiten kann (zB mit 2 oder 3 pro CPU auf der Datenbank-Maschine starten, bis Sie herausfinden, dass dies zu wenig oder many-- werde es sind in der Regel abhängig wie scheiben gebunden Ihre Anfragen sind)
  • erstellen Pool diese viele Verbindungen: im Wesentlichen eine Klasse, die Sie für „die nächste freie Verbindung“ zu Beginn jeden Verfahren stellen können und „Pass zurück“ auf den Pool am Ende dann jede Methode
  • Ihre getFreeConnection () -Methode muss eine freie Verbindung zurück, wenn ein solcher vorhanden ist, sonst entweder (1) einen neuen erstellen, bis die maximale Anzahl von Verbindungen, die Sie sich entschieden haben, zu ermöglichen, oder (2) wenn die maximale bereits erstellt werden, warten Sie auf eine freie
  • werden
  • Ich würde die Semaphore-Klasse empfehlen, die Verbindungen zu verwalten; Ich habe eigentlich einen kurzen Artikel auf meiner Website auf einen Ressourcenpool mit einer Semaphore Verwaltung mit ein Beispiel, das ich glaube, Sie für Ihren Zweck anpassen könnten

Ein paar praktische Überlegungen:

  • Für eine optimale Leistung müssen Sie vorsichtig sein, nicht zu „Schwein“ eine Verbindung, während Sie nicht tatsächlich mit einer Abfrage laufen. Wenn Sie einmal eine Verbindung aus dem Pool nehmen und es dann verschiedenen Methoden übergeben, müssen Sie sicherstellen dass Sie nicht versehentlich dies zu tun.
  • Vergessen Sie nicht, Ihre Verbindungen zu dem Pool zurück! (Try / finally ist dein Freund hier ...)
  • Auf vielen Systemen Sie können Verbindungen nicht offen halten ‚für immer‘ : die O / S sie nach einiger maximalen Zeit geschlossen. Also in Ihrem ‚Rückkehr eine Verbindung zum Pool‘ Methode, müssen Sie über denken ‚Ruhestand‘ Verbindungen, die sich für eine lange Zeit gewesen sein (in einem Mechanismus bauen für die Erinnerung, zum Beispiel, indem ein Wrapper-Objekt um eine tatsächliche JDBC Connection-Objekt, das Sie speichern Metriken wie diese verwenden können)
  • Sie können wollen vorbereitete Anweisungen prüfen, mit.
  • Im Laufe der Zeit werden Sie wahrscheinlich brauchen, um zwicken die Verbindung Poolgröße

Andere Tipps

Sie können entweder in der Verbindung übergeben oder besser noch so etwas wie Jakarta Database Connection Pooling verwenden. http://commons.apache.org/dbcp/

Sie sollten einen Verbindungspool für diese verwenden.

Auf diese Weise können für die Verbindung fragen konnte, und es freigeben, wenn Sie Finish mit ihm sind und senden es an den Pool

Wenn ein anderer Thread eine neue Verbindung will, und dass man in Gebrauch ist, könnte ein neuer erstellt werden. Wenn kein anderer Thread eine Verbindung verwendet die gleiche wiederverwendet werden kann.

So können Sie Ihre App irgendwie den Weg verlassen können, ist es (und vorbei die Verbindung nicht rundum) und immer noch die Ressourcen richtig nutzen.

Leider erste Klasse ConnectionPools sind nicht sehr einfach in Standalone-Anwendungen verwenden (sie der Standard in Anwendungsserver) Wahrscheinlich einen Mikrocontainer (wie Sping) oder einen guten Rahmen (wie Hibernate) können Sie eine solche verwenden lassen.

Sie sind nicht zu hart ein von Grund auf, obwohl zu codieren.

:)

diese Google-Suche wird helfen Sie mehr darüber zu erfahren, wie man verwenden.

Skim durch

Viele JDBC-Treiber tun Verbindungsspooling für Sie, so dass es wenig Vorteil zusätzliche Bündelung in diesem Fall zu tun. Ich schlage vor, Sie in der Dokumentation überprüfen Sie JDBC-Treiber.

Ein weiterer Ansatz zur Verbindungspool ist

  • Haben Sie eine Verbindung für alle Datenbankzugriff mit synchronisierten Zugriff. Dies gilt nicht Parallelität erlauben, aber ist sehr einfach.
  • Speichern Sie die Verbindungen in einem Thread Variable (außer Kraft setzen Anfangswert ()) Das funktioniert gut, wenn es eine kleine feste Anzahl von Threads ist.

Ansonsten würde ich vorschlagen, einen Verbindungspool verwenden.

Wenn Ihre Anwendung single-threaded ist, oder hat alle seine Datenbank-Operationen von einem einzelnen Thread, dann ist es in Ordnung, eine einzige Verbindung zu verwenden. Angenommen, Sie brauchen nicht mehrere Verbindungen aus irgendeinem anderen Grund, dies die einfachste Implementierung bei weitem wäre.

auf Ihrem Fahrer Abhängig kann es auch möglich sein, eine Verbindung zwischen den Threads zu teilen - auch das wäre in Ordnung, wenn Sie Ihren Fahrern vertrauen nicht um seine Thread-Sicherheit zu liegen. Ihre Treiber-Dokumentation für weitere Informationen.

Typischerweise wird die Objekte unter „Verbindung“ können nicht sicher von mehreren Threads verwendet werden, so dass es im Allgemeinen nicht ratsam ist ResultSet, Statement-Objekte usw. zwischen Threads zu teilen - mit Abstand die beste Politik ist, sie im selben Thread zu verwenden, die sie geschaffen haben; dies ist in der Regel einfach, weil diese Objekte sind im Allgemeinen nicht zu lange gehalten werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top