2008-08-26 11 views
1

Eine Diskussion über Singletons in PHP hat mich mehr und mehr über dieses Thema denken. Die meisten Leute weisen an, dass Sie nicht eine Menge von DB-Verbindungen in einer Anfrage machen 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 konterte ich mich mit der Frage: Würden nicht mehrere Verbindungen die gleichzeitige Abfrage effizienter machen?Warum ist es eine schlechte Übung, mehrere Datenbankverbindungen in einer Anfrage zu erstellen?

Wie wäre es mit einigen Antworten (mit Beweisen, Leute) von einigen Leuten im Wissen?

Antwort

6

Datenbankverbindungen sind eine begrenzte Ressource. Einige DBs haben eine sehr niedrige Verbindungsgrenze, und das Verschwenden von Verbindungen ist ein großes Problem. Wenn Sie viele Verbindungen verbrauchen, können Sie andere für die Verwendung der Datenbank blockieren.

Darüber hinaus hilft das Werfen einer Tonne zusätzlicher Verbindungen in der DB nichts, wenn sich Ressourcen auf dem DB-Server im Leerlauf befinden. Wenn Sie 8 Kerne haben und nur einer verwendet wird, um eine Anfrage zu beantworten, dann ist es sicher, dass eine andere Verbindung helfen könnte. Wahrscheinlicher ist jedoch, dass Sie bereits alle verfügbaren Kerne verwenden. Sie treffen wahrscheinlich auch die gleiche Festplatte für jede Datenbankanforderung 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 so, als würde man in einer Anwendung zusätzliche Threads erzeugen, die blind sind und hoffen, dass die zusätzliche Parallelität die Verarbeitung beschleunigt. Es könnte unter bestimmten Umständen, aber in anderen Fällen wird es nur verlangsamen Sie, wie Sie die Festplatte thrash, Verschwendung Zeit Task-Switching, und Einführung Synchronisation Aufwand.

3

Es ist die Kosten für den Aufbau der Verbindung, die Übertragung der Daten und dann das Abreißen. Es wird deine Leistung auffressen.

Evidence ist schwerer zu bekommen, aber die folgende betrachten ...

Lassen Sie uns sagen, dass es x Mikrosekunden dauert, eine Verbindung herzustellen.

Jetzt möchten Sie mehrere Anfragen stellen und Daten hin und her erhalten. Sagen wir, dass der Unterschied in der Transportzeit zwischen einer Verbindung und vielen vernachlässigbar ist (nur um der Argumentation willen).

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

Das Öffnen einer Verbindung dauert x + y Mikrosekunden. Viele zu öffnen wird n * (x + y) nehmen. Das wird deine Ausführung verzögern.

0

Ich würde annehmen, dass es, weil Ihre Anforderungen nicht asynchron gesendet werden, da Ihre Anforderungen iterativ auf dem Server ausgeführt werden, jedes Mal zu blockieren, müssen Sie den Overhead für das Erstellen einer Verbindung jedes Mal bezahlen, wenn Sie nur müssen Sie es einmal tun ...

In Flex werden alle Web-Service-Anrufe automatisch asynchron aufgerufen, so dass Sie häufig mehrere Verbindungen sehen oder Anfragen in der gleichen Verbindung in der Warteschlange haben.

Asynchrone Anfragen mindern die Verbindungskosten durch schnellere Anfrage/Antwortzeit ... weil Sie leicht dies in PHP erreichen können, ohne einige Threading, dann ist der Leistungshieb größer als einfach die gleiche Verbindung wiederverwenden.

, dass meine 2 Cent ist ...

2

eine DB-Verbindung einrichten ist in der Regel ziemlich schwer. Eine Menge Dinge sind Backstage (DNS-Auflösung/TCP-Verbindung/Handshake/Authentifizierung/aktuelle Abfrage).

Ich hatte einmal ein Problem mit einer seltsamen DNS-Konfiguration, bei der jede TCP-Verbindung ein paar Sekunden dauerte, bevor sie hochging. Meine Login-Prozedur (wegen einer komplexen Architektur) benötigte 3 verschiedene DB-Verbindungen. Mit diesem Problem dauerte es ewig, um sich einzuloggen. Wir haben den Code dann umstrukturiert, damit er nur eine Verbindung durchläuft.

1

Wir greifen auf Informix von .NET zu und verwenden mehrere Verbindungen. Wenn wir nicht bei jeder Verbindung eine Transaktion starten, wird dies oft im Verbindungspool gehandhabt. Ich weiß, dass das sehr markenspezifisch ist, aber der Cilent-Zugang der meisten (?) Datenbanksysteme wird Verbindungen bestmöglich bündeln.

Nebenbei hatten wir ein Problem mit der Anzahl der Verbindungen wegen der datenbankübergreifenden Verbindungen.Informix unterstützt Synonyme, so dass wir die gängigen Täter synonymisierten und die verschiedenen Verbindungen serverseitig behandelt wurden, was viel Zeit bei der Übertragung, beim Verbindungsaufbau und bei den Lizenzkosten (die eigentliche Crux unserer Situtation) spart.