Frage

Ich bin mit MySQL 5.0 für eine Website, die von GoDaddy (Linux) gehostet wird.

ich mache einige Tests auf meinem Web-app, und plötzlich bemerkte ich, dass die Seiten wirklich langsam waren erfrischend. Schließlich, nach einer langen Wartezeit, habe ich auf eine Seite, die etwas entlang der Linien der „MySQL Fehler, zu viele Verbindungen ...“, und es deutete auf meine config.php-Datei, die mit der Datenbank verbunden ist.

Es hat mich gerade mit der Datenbank verbinden, keine anderen Benutzer. Auf jedem meiner Seiten, schließe ich die config.php an der Spitze, und schließen Sie am Ende der Seite, um die MySQL-Verbindung. Es kann mehrere Anfragen werden zwischendurch. Ich fürchte, dass ich nicht mysql Verbindungen genug (mysql_close ()) zu schließen.

Allerdings, wenn ich versuche, sie zu schließen, nachdem eine Abfrage ausgeführt wird, erhalte ich einen Verbindungsfehler auf der Seite. Meine Seiten sind PHP und HTML. Wenn ich versuche, eine Abfrage zu schließen, scheint es, dass der nächste nicht verbinden. Würde ich config.php wieder nach dem Ende aufzunehmen, um die Verbindung haben?

Dieser Fehler hat mir Angst gemacht, weil in 2 Wochen, etwa 84 Menschen mit dieser Web-Anwendung zu starten.

Danke.

EDIT:

Hier finden Sie einige Pseudo-Code auf meiner Seite:

 require_once('../scripts/config.php');

 <?php
    mysql_query..

    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
    if(this button is pressed){
       mysql_query...
    }
 ?>
 some html..
 ..
 ..
 ..
 ..
 <?php
   another mysql_query...
 ?>
 some more html..
 ..
 ..
 <?php mysql_close(); ?>

dachte ich, dass diese Art und Weise, jedes Mal, wenn die Seite öffnet, wird die Verbindung öffnet und schließt dann die Verbindung, wenn die Seite geladen wird. Dann öffnet sich die Verbindung wieder, wenn jemand auf einen Knopf auf der Seite klickt, und so weiter ...

EDIT:

Okay, so habe ich gerade von dem Telefon mit GoDaddy. Offenbar mit meinem Economy Paket, ich bin zu einer Zeit, zu 50 Verbindungen begrenzt. Während mein Problem heute mit nur passiert mir die Website zugreifen, sagten sie, dass sie früher einige Server Probleme hatten. Aber da, wie ich 84 Benutzer für meine Web-App haben werde, sollte ich wahrscheinlich ein Upgrade auf „Deluxe“, die für 100 Verbindungen gleichzeitig ermöglicht. An einem bestimmten Tag kann es rund 30 Benutzer sein meine Seite zu einem Zeitpunkt zugreifen, so denke ich, die 100 wäre eine sicherere Wette. Haben Sie Jungs zustimmen?

War es hilfreich?

Lösung

Shared-Hosting-Provider erlauben im Allgemeinen eine ziemlich kleine Menge von gleichzeitigen Verbindungen für den gleichen Benutzer.

Was ist Ihr Code tut, ist:

  • Öffnen Sie eine Verbindung mit dem MySQL-Server
  • tun es stuff (Erzeugen der Seite)
  • schließen Sie die Verbindung am Ende der Seite.

Der letzte Schritt, wenn am Ende der Seite getan ist nicht obligatorisch : (Zitat mysql_close 's-Handbuch):

  

Mit mysql_close () ist nicht in der Regel   notwendig, als nicht-persistent offene   Links werden automatisch an die geschlossen   Ende der Ausführung des Skripts.

Beachten Sie aber, Sie wahrscheinlich nicht persistente Verbindungen verwenden sollte auf jeden Fall ...

Zwei Tipps:

  • Verwendung mysql_connect insead von mysql_pconnect (schon OK für Sie)
  • Stellen Sie den vierten Parameter von mysql_connect auf false (schon OK für Sie, wie es der Standardwert ist) : (Zitat Handbuch):
  

Wenn ein zweiter Anruf wird auf   mysql_connect () mit dem gleichen   Argumente, wird keine neue Verbindung sein   gegründet, sondern stattdessen der Link   Identifikator der bereits bestehenden Verbindung   Wird zurückgegeben.

     

Die new_link   Parameter ändert dieses Verhalten und   mysql_connect () immer geöffnet   Ein neuer Link, auch wenn mysql_connect () war   bevor sie mit dem gleichnamigen   Parameter.



Was das Problem verursachen könnte, dann?

Vielleicht versuchen Sie mehrere Seiten parallel (mit mehreren Tabs in Ihrem Browser, zum Beispiel) zuzugreifen, die mehrere Benutzer simulieren werden die Website zur gleichen Zeit verwenden?

Wenn Sie viele Benutzer mit der Website zur gleichen Zeit und den Code zwischen mysql_connect und das Schließen der Verbindung nimmt viel Zeit haben, wird es bedeuten, viele Verbindungen gleichzeitig geöffnet werden ... Und Sie erreichen die Grenze : - (

Still, wie Sie der einzige Benutzer der Anwendung sind, wenn man bedenkt Sie bis zu 200 gleichzeitige Verbindungen erlaubt haben oben, es ist etwas seltsam los ...



Nun, darüber nachzudenken, " zu viele Verbindungen " und "max_connections" ...

Wenn ich mich richtig erinnere, hat max_connections nicht die Anzahl der Verbindungen begrenzt Sie kann mit dem MySQL-Server öffnen, aber die Gesamtzahl der Verbindungen , die zu dem geöffneten bo können Server, von jemandem daran anschließen .

Zitiert von MySQL-Dokumentation auf :

  

Wenn Sie erhalten eine zu viele Verbindungen   Fehler, wenn Sie versuchen, das verbinden   -Server, bedeutet dies, dass alle   verfügbare Verbindungen sind im Einsatz bei   andere Kunden.

     

Die Anzahl der Verbindungen erlaubt ist   durch die max_connections gesteuerten   Systemvariablen. Der Standardwert ist   100. Wenn Sie mehr Verbindungen unterstützen müssen, sollten Sie eine größere eingestellt   Wert für diese Variable.

Also, eigentlich, könnte das Problem kommt nicht von Ihnen noch Ihrem Code (was gut aussieht, tatsächlich) : es könnte „nur“ sein, dass Sie nicht der einzige sind, versucht, dass die Verbindung MySQL-Server (denken sie daran, "Shared Hosting") , und dass es zu viele Leute es zugleich mit ...

... Und wenn ich recht habe, und es ist, dass , gibt es nichts, das Problem lösen können: so lange wie es zu viele Datenbanken / Benutzer auf diesem Server und dass max_connection ist auf 200, werden Sie leiden weiter ...


Als Nebenbemerkung: vor ihnen darüber zu GoDaddy fragen zurück, wäre es schön, wenn jemand bestätigen kann, was ich gerade gesagt habe ^^

Andere Tipps

Ich hatte etwa 18 Monate Umgang mit diesem ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- Fehler / )

Die Lösungen, die ich hatte (das auf Sie zutreffen würde) am Ende waren:

  1. zur Optimierung der Datenbank nach MySQLTuner .
  2. defragmentieren die Tabellen wöchentlich auf der Grundlage dieser Post

Defragmentieren Bash-Skript aus dem Beitrag:

#!/bin/bash

# Get a list of all fragmented tables
FRAGMENTED_TABLES="$( mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND
Data_free > 0` | grep -v '^+' | sed 's,t,.,' )"

for fragment in $FRAGMENTED_TABLES; do
  database="$( echo $fragment | cut -d. -f1 )"
  table="$( echo $fragment | cut -d. -f2 )"
  [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database;
  OPTIMIZE TABLE $table;" > /dev/null 2>&1
done

Achten Sie darauf, nicht persistente Verbindungen verwenden. Dies ist in der Regel eine schlechte Idee ..

Wenn du das hast .. Allenfalls müssen Sie nur so viele Verbindungen unterstützen, wie Sie Apache Prozesse haben. Sind Sie in der Lage, die max_connections Einstellung zu ändern?

Sind Sie ganz sicher, dass der Datenbankserver für Sie völlig gewidmet ist?

Melden Sie sich an die datbase als root auf und verwenden „SHOW PROCESS“ zu sehen, wer verbunden ist. Idealer Haken dies in Ihr Überwachungssystem zu sehen, wie viele Verbindungen gibt es im Laufe der Zeit und Alarm gibt, wenn es zu viele sind.

Die maximalen Datenbankverbindungen können in my.cnf so konfiguriert werden, aber achten Sie auf aus dem Speicher oder Adressraum ausgeführt wird.

Wenn Sie einen Shell-Zugang haben, verwenden Sie netstat, um zu sehen, wie viele Steckdosen in Ihrer Datenbank geöffnet und woher sie kommen.

Unter Linux Typ:

netstat -n -a |grep 3306

Ein Fenster, Typ:

netstat -n -a |findstr 3306

Die Lösung könnte einer von ihnen, stieß ich auf diese in einem MCQA Test, auch habe ich nicht verstanden, welche die richtige ist!

Setzen Sie diese in my.cnf "set-variable = max_connections = 200"

Führen Sie den Befehl "SET GLOBALmax_connections = 200"

Verwenden Sie immer mysql_connect () Funktion, um den MySQL-Server verbinden

Verwenden Sie immer mysql_pconnect () Funktion, um den MySQL-Server verbinden

Istas Lösungen sind möglich:

1) Erhöhen Sie die maximale Verbindungseinstellung durch die globale Variable in mysql Einstellung.

set global max_connection=200;

. Hinweis: Es wird die Serverbelastung erhöhen

2) Leeren Sie den Verbindungspool wie folgt:

FLUSH HOSTS;

3) Ihre PROCESS überprüfen und spezifische PROCESS töten, wenn Sie irgendwelche von ihnen nicht wollen.


Sie können diese beziehen: -

Artikel-Link

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