2009-07-14 15 views
15

Ich arbeite an der Implementierung der Verwendung der Mysql-Klasse gefunden here in einem vorhandenen Skript. Das Skript muss fast immer mit der Datenbank interagieren, auch wenn dies manchmal nicht der Fall ist. Was ist in diesem Fall die beste Vorgehensweise? Sollte ich eine Verbindung öffnen und diese bis zum Ende des Skripts offen halten oder sollte ich eine Verbindung öffnen, wenn ich eine brauche, und sie schließen, wenn ich fertig bin, um zu vermeiden, dass eine Verbindung geöffnet wird, wenn das Skript sie nicht benötigt?Wo und wann eine Datenbankverbindung zu öffnen

+0

+1 ausgezeichnete Frage – Tyler

Antwort

13

Da Verbindungen ziemlich teuer sind, wie andere darauf hingewiesen haben, würde ich empfehlen, eine "Lazy Connect" -Technik in Ihrer Datenbank-Ebene zu verwenden. Wenn Sie Ihre Anwendung effektiv strukturiert haben, sollte sich Ihre Anwendungslogik nicht mit dem Öffnen und Schließen von Verbindungen befassen, da dies in der Datenbankschicht enthalten wäre. Wenn die Datenbankebene aufgefordert wird, eine Abfrage auszuführen, prüft sie zunächst, ob eine aktive Verbindung besteht, und erstellt andernfalls eine neue Verbindung. Auf diese Weise vermeiden Sie das Öffnen von Verbindungen, die nie verwendet werden, und Sie haben eine gute Logiktrennung zwischen Ihrer Anwendung und dem Datenbankcode.

+0

+1 gute Antwort. –

+0

Wann würden Sie eine bestimmte Verbindung schließen? – Tyler

+1

Kurz gesagt, schließen Sie die Datenbankverbindung, sobald Sie damit fertig sind. In meiner aktuellen Anwendung haben wir einen ziemlich sauberen Seitengenerierungsprozess: Wir greifen alle Daten, die wir brauchen, aus der Datenbank, massieren sie in die Form, die wir brauchen, schieben sie in das Template-Objekt, disconnect von der Datenbank, und erzeugen sie dann und geben Sie den HTML-Code für die Seite aus. –

2

Nun, wenn Sie eine Klasse verwenden, sollte die Verbindung automatisch geöffnet werden, wenn Sie die Klasse instanziieren, oder wenn die erste Abfrage ausgeführt wird. Wenn Sie die Klasse nie verwenden, wird die Verbindung nicht geöffnet. Es ist zwar eine gute Methode, es zu schließen, wenn Sie es nicht brauchen, aber es tut nicht weh, es geschlossen zu lassen, wenn der Anfragethread stirbt.

Dies kann schlecht sein, wenn Sie keine Ressourcenbeschränkungen in Ihrer php.ini-Datei festgelegt haben, könnte die Anfrage für immer leben und niemals die Verbindung beenden.

Wenn Sie eine Website mit mittlerem bis hohem Traffic haben, sollten Sie darüber nachdenken, mysql_pconnect zu verwenden, so dass immer eine Verbindung offen ist und Sie nicht den Overhead benötigen, um bei jeder Anfrage einen zu öffnen.

1

Normalerweise möchten Sie nur eine Verbindung zu Ihrer Datenbank öffnen, wenn Sie diese Verbindung verwenden müssen. Das Offenhalten von Verbindungen kann die Wahrscheinlichkeit erhöhen, dass ein Teil des Codes versehentlich oder böswillig durch die Aktionen anderer Benutzer dazu führt, dass unerwünschte Abfragen in der Datenbank ausgeführt werden.

In diesem Fall sollten Sie die Verbindung nur öffnen, bevor Sie Ihre Abfragen ausführen möchten. Wenn Sie eine große Anzahl von Abfragen haben, versuchen Sie, Ihre Verbindung so spät wie möglich zu öffnen.

Es ist besser, eine Verbindung länger geöffnet zu lassen als mehrere Verbindungen zu öffnen und zu schließen.

+0

Ja, das Öffnen von Verbindungen ist teuer. –

0

Wenn Ihr Code leistungsabhängig ist, besteht die bevorzugte Technik darin, eine Form von Verbindungspooling und/oder persistenten Prozessen zu verwenden, sodass Sie eine Datenbankverbindung öffnen und diese Verbindung dann für viele Seitenanforderungen verwenden können als eine neue Verbindung für jede Anfrage zu öffnen, die eine benötigt.

Wenn Ihr Code nicht performance-sensitiv ist, spielt es eigentlich keine Rolle.

In beiden Fällen ist der genaue Zeitpunkt des Zugriffs auf die Datenbank während der Bearbeitung einer bestimmten Anforderung kein Grund zur Besorgnis.

Meine persönliche Praxis ist, eine Datenbankverbindung sofort zu öffnen, wenn ein neuer Handler-Prozess erzeugt wird, und dann zu überprüfen, dass es noch am Leben ist, wenn ich mit der Verarbeitung jeder Anfrage beginne. Der Rest des Codes kann dann frei davon ausgehen, dass die Verbindung bei Bedarf verfügbar ist, ohne dass die Verbindungskosten entstehen, während ein Benutzer auf eine Antwort wartet.

Verwandte Themen