Warum ist es eine schlechte Praxis, mehrere Datenbankverbindungen in einer Anfrage herzustellen?

StackOverflow https://stackoverflow.com/questions/28590

Frage

Eine Diskussion über Singletons in PHP lässt mich immer mehr über dieses Thema nachdenken.Die meisten Leute weisen darauf hin, dass Sie nicht mehrere DB-Verbindungen in einer Anfrage herstellen sollten, und ich bin nur neugierig, was Ihre Argumentation ist.Mein erster Gedanke ist der Aufwand für Ihr Skript, so viele Anfragen an die Datenbank zu stellen, aber dann kontere ich mich mit der Frage:Würden mehrere Verbindungen gleichzeitige Abfragen nicht effizienter machen?

Wie wäre es mit ein paar Antworten (mit Beweisen, Leute) von ein paar Leuten, die sich auskennen?

War es hilfreich?

Lösung

Datenbankverbindungen sind eine begrenzte Ressource.Einige DBs haben ein sehr niedriges Verbindungslimit, und die Verschwendung von Verbindungen ist ein großes Problem.Indem Sie viele Verbindungen verbrauchen, blockieren Sie möglicherweise andere für die Nutzung der Datenbank.

Darüber hinaus hilft es nichts, eine Menge zusätzlicher Verbindungen an die Datenbank zu senden, es sei denn, es sind Ressourcen auf dem Datenbankserver im Leerlauf.Wenn Sie über 8 Kerne verfügen und nur einer zur Erfüllung einer Anfrage verwendet wird, kann es sicher hilfreich sein, eine weitere Verbindung herzustellen.Wahrscheinlicher ist jedoch, dass Sie bereits alle verfügbaren Kerne nutzen.Außerdem greifen Sie wahrscheinlich bei jeder DB-Anfrage auf dieselbe Festplatte zu und fügen zusätzliche Sperrkonflikte hinzu.

Wenn Ihre Datenbank eine hohe Auslastung aufweist, hilft das Hinzufügen zusätzlicher Verbindungen nicht.Das wäre, als würde man in einer Anwendung zusätzliche Threads erzeugen, in der blinden Hoffnung, dass die zusätzliche Parallelität die Verarbeitung beschleunigt.Es könnte Unter bestimmten Umständen verlangsamt es Sie jedoch einfach, weil Sie die Festplatte überlasten, Zeit mit dem Wechseln von Aufgaben verschwenden und einen Synchronisierungsaufwand verursachen.

Andere Tipps

Dabei handelt es sich um die Kosten für den Verbindungsaufbau, die Datenübertragung und den anschließenden Abbau.Es wird Ihre Leistung verschlingen.

Es ist schwieriger, Beweise zu finden, aber bedenken Sie Folgendes ...

Nehmen wir an, es dauert x Mikrosekunden, um eine Verbindung herzustellen.

Nun möchten Sie mehrere Anfragen stellen und Daten hin und her bekommen.Nehmen wir an, dass der Unterschied in der Transportzeit zwischen einer und vielen Verbindungen vernachlässigbar ist (nur der Argumentation halber).

Nehmen wir nun an, es dauert y Mikrosekunden, um die Verbindung zu schließen.

Das Öffnen einer Verbindung erfordert einen Overhead von x+y Mikrosekunden.Das Öffnen vieler benötigt n * (x+y).Das wird Ihre Hinrichtung verzögern.

Das Einrichten einer DB-Verbindung ist normalerweise ziemlich aufwändig.Hinter den Kulissen passiert viel (DNS-Auflösung/TCP-Verbindung/Handshake/Authentifizierung/Tatsächliche Abfrage).

Ich hatte einmal ein Problem mit einer seltsamen DNS-Konfiguration, die dazu führte, dass es einige Sekunden dauerte, bis jede TCP-Verbindung hergestellt wurde.Mein Anmeldevorgang erforderte (aufgrund einer komplexen Architektur) drei verschiedene DB-Verbindungen.Aufgrund dieses Problems dauerte die Anmeldung ewig.Anschließend haben wir den Code so umgestaltet, dass er nur noch eine Verbindung durchläuft.

Wir greifen über .NET auf Informix zu und nutzen mehrere Verbindungen.Sofern wir nicht für jede Verbindung eine Transaktion starten, wird diese häufig im Verbindungspool abgewickelt.Ich weiß, dass das sehr markenspezifisch ist, aber der Client-Zugriff der meisten (?) Datenbanksysteme bündelt Verbindungen nach besten Kräften.

Abgesehen davon hatten wir aufgrund datenbankübergreifender Verbindungen ein Problem mit der Verbindungsanzahl.Informix unterstützt Synonyme, daher haben wir die häufigsten Übeltäter synonymisiert und die mehreren Verbindungen serverseitig abgewickelt, was viel Übertragungszeit, Aufwand für die Verbindungserstellung und (der eigentliche Knackpunkt unserer Situation) Lizenzgebühren spart.

Ich gehe davon aus, dass das daran liegt, dass Ihre Anfragen nicht asynchron gesendet werden, da Ihre Anfragen iterativ auf dem Server ausgeführt werden und jedes Mal blockiert werden. Sie müssen für den Mehraufwand für die Herstellung einer Verbindung jedes Mal aufkommen, wenn Sie dies nur tun müssen einmal...

In Flex werden alle Webdienstaufrufe automatisch asynchron aufgerufen, sodass es häufig vorkommt, dass mehrere Verbindungen oder in der Warteschlange befindliche Anfragen für dieselbe Verbindung angezeigt werden.

Asynchrone Anfragen verringern die Verbindungskosten durch schnellere Anfrage-/Antwortzeiten ... weil dies nicht möglich ist leicht Wenn Sie dies in PHP ohne Threading erreichen, ist der Leistungseinbruch größer, als wenn Sie einfach dieselbe Verbindung wiederverwenden.

das sind meine 2 Cent...

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