2011-01-12 4 views
4

Ich mache meinen ersten Ausflug mit mysql und habe Zweifel, wie ich mit den Verbindungen meiner Anwendungen umgehen soll.MySQL-Verbindungen. Soll ich es vor jeder Transaktion am Leben erhalten oder eine neue Verbindung aufbauen?

Was ich jetzt mache, ist eine Verbindung zu öffnen und sie am Leben zu halten, bis ich mein Programm beende. Ich mache hin und wieder eine mysql_ping() und die Verbindung wird mit MYSQL_OPT_RECONNECT gestartet. Die andere Option (ich kann daran denken), wäre, eine neue Verbindung zu starten, bevor Sie irgendetwas tun, das meine Verbindung zur Datenbank erfordert und es schließt, nachdem ich damit fertig bin.

Was sind die Vor- und Nachteile dieser beiden Ansätze? Was sind die "Nebenwirkungen" einer langen Verbindung? Was ist die am häufigsten verwendete Methode, um dies zu behandeln?

Beifall;)


Einige zusätzliche Details

An dieser Stelle Ich halte die Verbindung lebendig und ich es hin und wieder ping jetzt ist es Status und wieder, wenn nötig.

Trotzdem, wenn es einige konsistente Gleichzeitigkeit mit Abfragen in schneller Abfolge gibt, bekomme ich eine "Server hat weg" -Meldung und nach einer Weile wird die Verbindung wieder hergestellt.

Ich frage mich, ob dies ein Nebeneffekt einer längeren Verbindung ist oder wenn dies nur eine schlechte mysql Serverkonfiguration ist.

Irgendwelche Ideen?

+0

Für diese "zusätzliche Details" suchen Sie besser nach vorhandenen Fragen zu diesem Thema oder öffnen Sie eine neue Frage. –

Antwort

6

Im Allgemeinen entstehen beim Öffnen einer Verbindung erhebliche Mehrkosten. Abhängig davon, wie oft Sie dies erwarten, ist es in Ordnung, aber wenn Sie irgendeine Art von Anwendung schreiben, die mehr als nur ein paar Befehle pro Programmausführung ausführt, würde ich einen Verbindungspool (für Server-Apps) oder um empfehlen Mindestens eine oder sehr wenige Verbindungen von Ihrer Standalone-App, die für einige Zeit geöffnet und für mehrere Transaktionen wiederverwendet werden sollen.

Auf diese Weise haben Sie eine bessere Kontrolle darüber, wie viele Verbindungen auf Anwendungsebene geöffnet werden, noch bevor der Datenbankserver involviert ist. Dies ist ein Service, den ein Anwendungsserver Ihnen bietet, aber er kann auch ziemlich einfach zusammengerollt werden, wenn Sie ihn kleiner halten möchten.

Neben den Leistungsgründen ist ein Pool auch eine gute Idee, um auf Bedarfsspitzen vorbereitet zu sein. Wenn viele Anfragen eingehen und jeder von ihnen versucht, eine separate Verbindung zur Datenbank zu öffnen - oder wie Sie es sogar vorgeschlagen haben (pro Transaktion) - werden Ihnen schnell die Ressourcen ausgehen.Bedenken Sie, dass jede Verbindung Speicher in MySQL verbraucht!

Auch Sie wollen sicherstellen, einen Nicht-root-Benutzer verwenden, um eine Verbindung herzustellen, denn wenn Sie nicht (ich glaube, es ist gebunden an die MySQL SUPER Privileg), könnten Sie sich ausgesperrt finden. MySQL reserviert mindestens eine Verbindung für einen Administrator zur Problembehebung, aber wenn Ihre App mit dieser Berechtigung verbunden ist, sind alle Verbindungen bereits verbraucht, wenn Sie versuchen, das Feuer manuell zu löschen.

0

Welche Art von Anwendung schreiben Sie? Wenn es ein Webscript ist: Halten Sie es offen. Wenn es sich um eine ausführbare Datei handelt, poolen Sie Ihre Verbindungen (falls nötig, wird die meiste Zeit ein Singleton tun).

+0

Es ist eine ausführbare Datei. Was meinst du damit, die Verbindungen zu bündeln? –

1

Wenn Sie nicht befürchten, zu viele Verbindungen geöffnet zu haben (d. H. Über 1.000), lässt Sie die Verbindung offen. Es gibt Overhead beim Verbinden/Wiederverbinden, was die Dinge nur verlangsamen wird. Wenn Sie wissen, dass Sie die Verbindung gehen zu müssen, für eine Weile offen zu bleiben, führen Sie diese Abfrage stattdessen periodisch von Pingen:

SET SESSION wait_timeout=# 

Wo # ist die Anzahl der Sekunden, um eine inaktive Verbindung offen zu lassen.

+0

Nun, ich pinge die Verbindung an, um sie am Leben zu erhalten, und ich habe auch die Standard-Zeitüberschreitung. Ich nehme an, dass dies die Verbindung aufrecht erhält, richtig? –

+0

Ja, das Einstellen von wait_timeout hält die Verbindung so lange am Leben. Sie können es auf 1 Tag (86400) einstellen, wenn Sie möchten. Dann müssten Sie nur einmal pro Tag pingen. Sobald das Skript fertig ist, wird die Verbindung geschlossen, sodass die Verbindung nicht offen bleibt. –

Verwandte Themen