Frage

Was ist der beste Weg, um Ihren Pool mit Bezug auf Setup: -

  1. Wenn erstellen Sie Verbindungen?
  2. Wann schließen Sie Verbindungen, und würden Sie alle von ihnen in der Nähe?
  3. Sie testen Sie Verbindungen sind immer noch gut. Wann und wie?
  4. Wie kommst du darauf eine gute Zahl für die maximale Anzahl von Verbindungen aus?
  5. Welche Art von Überwachung haben Sie an der richtigen Stelle Benutzer des Pools, um sicherzustellen, gut erzogen? Können Sie aus der Aufnahme alles, was man schlecht Stück Code stoppen?
  6. Haben Sie Ihren eigenen Pool geschrieben, oder eine Drittanbieter-Bibliothek verwendet?

Ich glaube, das eine Agnostiker Frage, aber Kommentare über „Eigenschaften“ von bestimmten Datenbanken / Sprachen sind willkommen. Zum Beispiel könnte es langsamer oder teurer sein auf einigen Datenbanken als andere zu verbinden.

Um zu klären, ich habe nicht einen Pool von Grund auf neu zu schreiben beabsichtigen, diese Frage ist mehr darüber, wie eine vorhandene Bibliothek zu konfigurieren, die nicht bündeln.

War es hilfreich?

Lösung

Ich schrieb einen Verbindungspool für die Datenbank in Java, wenn es nur ein Design-Muster war und nicht eine gemeinsame Bibliothek. Jetzt benutze ich die ein in Tomcat gebaut.

habe ich einen Thread mehrere Aspekte des Pools und mehrere Parameter zu überwachen sein Verhalten zu kontrollieren ...

  1. minimumInPool = "3" ... Diese ersten drei werden beim Start erstellt. Der Pool ist nie unter drei fallen gelassen.
  2. maximumIdleTimeBeforeRemoval = „60“ ... Wenn ein connect für eine Stunde im Leerlauf ist, dann fallen lassen und eine neue erstellen. Leerlaufzeit wahrscheinlich bedeutet, dass es nur das Minimum von drei im Pool.
  3. maximumInUseTimeBeforeRemoval = „30“ ... Wenn eine bestimmte Verbindung für über 30 Minuten ausgecheckt wurde, dann etwas ist wahrscheinlich falsch. Daran erinnern sie und töten die Verbindung.
  4. maximumTimeBeforeRemoval = "60" ... Entfernen Sie es, wenn es über 60 Minuten alt ist.
  5. maximumUsageBeforeRemoval = "1000" ... Entfernen Sie es, wenn es mehr als 1000-mal ausgecheckt wurde.
  6. monitorInterval = "15" ... Überprüfen Sie die oben genannten Parameter alle 15 Minuten.

Dies diente dazu, mich sehr gut für ein paar Jahre. Die höchst ich je gesehen habe der Pool war 151 Verbindungen während eines wilden Peek. Normalerweise war der Pool auf etwa einem Dutzend bei intensiver Nutzung und idled auf das Minimum drei in den frühen Morgenstunden.

Ich habe Oracle JDBC-Thin-Treiber und mit einer Oracle-Datenbank.

Andere Tipps

Hier ist der Grund ich für eine aktuelle Implementierung verwendet.

  1. Haben zwei Arten von Verbindungen in Ihrem Verbindungspool. Die erste ist bereit, was bedeutet, offen, aber nicht in Verwendung durch einen Client. Die zweite ist aktiv, die von einem Client im Einsatz bedeutet.

  2. Haben Sie Ihr Connection-Pooling eine kleine Anzahl von Verbindungen bereit halten, mindestens N und maximal M. N in Abhängigkeit von der Spitzengeschwindigkeit werden kann, bei der eingestellt Ihrer Kunden Verbindungen anfordern. Wenn die Anzahl der bereit Verbindungen immer auf Null sinkt, müssen Sie eine größere N. Wenn die Zahl konstant hoch ist (sagen wir über 10), müssen Sie eine niedrigere N.

  3. Wenn ein Client eine Verbindung will, geben ihnen eine der bereit diejenigen (es aktiv zu machen), dann sofort eine neue öffnen, wenn es jetzt ist kleiner als N bereit (aber nicht die Client-Wartezeit für diese machen zu vervollständigen, oder werden Sie den Vorteil Pooling) verlieren. Dies stellt sicher, es wird immer mindestens N bereit Verbindungen sein. Falls keine bereit sind, wenn der Kunde will, werden sie warten müssen, um während Sie einen neuen erstellen.

  4. Wenn der Client mit einer aktiven Verbindung beendet, kehren sie in den Bereitschaftszustand, wenn es weniger als M bereit Verbindungen. schließen Sie es aus anderen Gründen. Dies verhindert, dass Sie mehr als M bereit Verbindungen haben.

  5. In regelmäßigen Abständen die fertigen Verbindungen recyceln abgestanden Verbindungen zu verhindern. Wenn es mehr als N bereit Verbindungen, schließen Sie einfach die älteste Verbindung. schließen Sie es sonst und öffnet eine andere.

Dies hat den Vorteil, genug bereit, die und jugendliche Verbindungen in Ihrem Connection-Pool, ohne den Server zu überlasten.

Jakarta Commons DBCP bereits tut all das, was Sie aufgelistet:

  • es schafft Verbindungen je nach Bedarf und verwaltet sie in einem Pool
  • kann es Verbindungen schließen, wenn sie nicht für einen bestimmten Zeitraum verwendet wurden,
  • kann eine Abfrage auf eine Verbindung ausgeführt werden, bevor es das Austeilen, und wenn ein Fehler auftritt, wird die Verbindung weggeworfen und ein neuer erstellt. Verbindungen können auch in regelmäßigen Abständen im Leerlauf getestet werden.
  • Sie können eine Grenze für die Anschlüsse setzen, und auch auf die minimale Anzahl von Verbindungen erstellt werden, bereit zu haben. Die Grenze natürlich hängt viel von Ihrer Anwendung.
  • Ich weiß nicht, wie, aber DBCP weiß, wenn eine Verbindung nicht geschlossen wird und schließt es für Sie, eine Ausnahme zu werfen, so dass Sie wissen, was passiert, wenn Sie Ihr Protokoll.
  • DBCP hat einen Timeout-Parameter, die sehr nützlich ist. Wenn alle Verbindungen im Pool verwendet werden, wird es für diese Zeit warten, bis eine Verbindung an den Pool zurückgegeben werden, und wenn es nicht verfügbar ist, wenn das Limit erreicht ist, erhalten Sie einen Fehler.

Sie können durch das Spiel mit der minimalen Anzahl von Verbindungen, die maximale Anzahl der Verbindungen erstellt werden, und die Timeout-tune Ihres Pool fein. Eine längere Timeout ermöglicht es Ihnen, eine untere Grenze von Verbindungen zu haben, während eine kürzere Timeout wird wahrscheinlich eine größere Anzahl erforderlich. Dies hängt stark ab, was Ihre Anwendung tut und wie sie die Verbindungen verwendet.

ich mit matt b vereinbaren, dass wir das Rad nicht neu erfinden sollten.

Allerdings mit Commons DBCP diskutierbar ist auf der Grundlage der Antworten der diese und diese Fragen. Es gibt bessere Alternativen erwähnt, gibt es wie c3po oder proxool .

Oder können Sie rdbms abhängig Verbindungspooling Mechanismus verwenden.

Ich bin mir nicht sicher, was der Kontext, in dem Sie Ihre Verbindungen verwenden, aber ich kann zu teilen, was für mich zu arbeiten scheint.

Ich benutze SQL-Server als mein Backend und eine Kombination von Caching mit es verwenden, um eine bessere Leistung zu bekommen. Meine Praxis ist die Verbindung offen zu halten, nur wenn ich brauche es eigentlich und keine Verbindungen zu bündeln, so dass sie sofort aufzuräumen und ich kann in SQL-Aktivität überwacht genau sehen, was aktiv ist und was nicht. Jede Verbindung in Anspruch nimmt Speicher so ist es schön ist es zu einem dumpfen Dröhnen zu halten, wenn sie nicht benötigt werden.

Bevor ich die Verbindung öffnen und schließen Frage zu beantworten, lassen Sie mich sagen, dass Caching wirklich wichtig ist. Erste ein Objekt aus dem Cache wird Ihnen eine Menge Zeit zu sparen. In einige meiner asp.net apps wenn Caching auf in dev habe ich festgestellt, dass ich kaum die Latenz während bei einem DB es überall könnte nehmen von 15ms bis 45ms rufen messen kann den Anruf zu beenden und dies nicht einmal erwägt andere Latenz Faktoren oder Last. Die andere Methode, die ich benutze, ist eine gute Objektstruktur für meine Daten so, dass ich nur ein DB-Update machen, wenn sich etwas ändert. Ich habe einige Methoden auf meinem Objekt o umgesetzt sicher, dass ich so wenig wie möglich IO habe zu tun.

Davon abgesehen wir alle wissen, dass wir in unsere DB zu einem bestimmten Zeitpunkt für den Zugriff auf und schreiben müssen, so dass ich zwei Prinzipien folgen:

  1. Halten Sie die Türen und Fenster geschlossen auf Energie zu sparen. Eine offene Verbindung an einem Ort bedeutet, dass es in einem anderen nicht verfügbar ist (oder der Speicher und andere Ressourcen sind begrenzt). Wir haben sich die Bündelung aus, weil es in eine bessere Leistung für uns geführt hat.

  2. ich so viel in Batch- oder auf einmal, wie ich kann, wenn die Verbindung geöffnet ist. Dies ist ein wenig komplizierter, so lassen Sie mich erklären.

    • eine Methode, die ich verwendet habe, ist meine Verbindung der Rohr Objekte nach unten weitergeben, so dass alle Objekte ein Connection-Objekt verwenden können. Daraus ergibt sich eine Verbindung offen ist und anstelle von vielleicht 10 oder mehr, je nach Ihrer Anwendung geschlossen. Ein gutes Beispiel hierfür ist ein unsere Kaufmodell, die Statistiken für das Sammeln und Hashing aus kompliziertem Bestellverhalten Vorteil der Leistung von SQL Server erfolgt. Es macht keinen Sinn, Öffnung zu halten und Schließen die Verbindung, wenn Sie 200K + DB-Lookup machen oder was auch immer die Anwendungen gedacht ist. Der andere Teil ist, dass, wenn ich Objekt verwenden, versuche ich mein Updates zu bündeln, die Zeit zu reduzieren, die ich halte die Verbindung offen. Damit ließ einen scope_identity auf dem Einsatz Anruf ist nimm ich kümmern sowohl meinen Einsatz und eine Lookup für die eindeutige ID zu meinem Objekt hinzufügen, bevor es das Caching. Zurück in dem Tag, als ich zum ersten Mal asp apps entwickle ich würde öffnen tatsächlich die Verbindung, sobald die Seite nach laden und schließen Sie es dann gestartet. Ich empfehle das nicht mehr tun. Nun wird ein Tag gibt es einen großen Vorteil für diese Art von Abstraktionen und Schichten, die ich jeder Anfänger Programmierer Aufmerksamkeit nehmen empfehlen würde.

Meine zwei Cent:

Cache Ihre Daten! Cachen Ihre Daten! Cachen Ihre Daten! Haben so wenig DB-Zugriff wie möglich, wenn Sie nicht zwischenspeichern und dann zwischengespeichert werden Ihre Daten!

Warum neu erfinden das Rad?

Jemand hat bereits gelöst wahrscheinlich das Problem, und besser.

Wenn Sie in der Java-Welt sind, können Sie Commons DBCP verwenden.

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