Domanda

Sto usando MySQL 5.0 per un sito ospitato da GoDaddy (linux).

Stavo facendo dei test sulla mia app Web e improvvisamente ho notato che le pagine si stavano aggiornando molto lentamente. Alla fine, dopo una lunga attesa, sono arrivato a una pagina che diceva qualcosa sulla falsariga di "Errore MySQL, Troppe connessioni ...", e indicava il mio file config.php che si collega al database.

Sono appena stato io a collegarmi al database, nessun altro utente. In ciascuna delle mie pagine, includo il file config.php in alto e chiudo la connessione mysql alla fine della pagina. Potrebbero esserci diverse domande nel mezzo. Temo di non chiudere abbastanza le connessioni mysql (mysql_close ()).

Tuttavia, quando provo a chiuderli dopo aver eseguito una query, ricevo errori di connessione sulla pagina. Le mie pagine sono PHP e HTML. Quando provo a chiudere una query, sembra che il successivo non si connetta. Dovrei includere di nuovo config.php dopo la chiusura per connettermi?

Questo errore mi ha spaventato perché in 2 settimane circa 84 persone hanno iniziato a utilizzare questa applicazione web.

Grazie.

EDIT:

Ecco alcuni pseudo-codici della mia pagina:

 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(); ?>

Ho pensato che in questo modo, ogni volta che la pagina si apre, la connessione si apre e quindi la connessione si chiude al termine del caricamento della pagina. Quindi, la connessione si apre di nuovo quando qualcuno fa clic su un pulsante sulla pagina e così via ...

EDIT:

Okay, quindi sono appena uscito dal telefono con GoDaddy. Apparentemente, con il mio pacchetto Economy, ho un limite di 50 connessioni alla volta. Mentre il mio problema oggi si è verificato solo con l'accesso al sito, mi hanno detto che avevano problemi con il server in precedenza. Tuttavia, visto che avrò 84 utenti per la mia app Web, dovrei probabilmente passare a "Deluxe", che consente 100 connessioni alla volta. In un determinato giorno, potrebbero esserci circa 30 utenti che accedono al mio sito alla volta, quindi penso che il 100 sarebbe una scommessa più sicura. Siete d'accordo?

È stato utile?

Soluzione

I provider di hosting condiviso in genere consentono una quantità piuttosto piccola di connessioni simultanee per lo stesso utente.

Quello che fa il tuo codice è:

  • apre una connessione al server MySQL
  • fai le cose (generando la pagina)
  • chiude la connessione alla fine della pagina.

L'ultimo passaggio, quando eseguito alla fine della pagina, non è obbligatorio : (citando < code> mysql_close ):

  

L'uso di mysql_close () di solito non lo è   necessario, come aperto non persistente   i collegamenti vengono automaticamente chiusi al   fine dell'esecuzione dello script.

Ma probabilmente non dovresti usare connessioni persistenti ...

Due suggerimenti:

  • usa mysql_connect invece di mysql_pconnect (già OK per te)
  • Imposta il quarto parametro di mysql_connect su false (già OK per te, poiché è il valore predefinito) : (citando il manuale):
  

Se viene effettuata una seconda chiamata a   mysql_connect () con lo stesso   argomenti, nessun nuovo link sarà   stabilito, ma invece, il collegamento   identificatore del collegamento già aperto   sarà restituito.

     

New_link   Il parametro modifica questo comportamento e   rende mysql_connect () sempre aperto a   nuovo collegamento, anche se mysql_connect () era   chiamato prima con lo stesso   i parametri.


Che cosa potrebbe causare il problema, quindi?

Forse stai tentando di accedere a più pagine in parallelo (utilizzando più schede nel tuo browser, ad esempio) , che simulerà diversi utenti che utilizzano il sito Web contemporaneamente?

Se hai molti utenti che utilizzano il sito contemporaneamente e il codice tra mysql_connect e la chiusura della connessione richiede molto tempo, significa che molte connessioni verranno aperte contemporaneamente. .. E raggiungerai il limite :-(

Tuttavia, poiché sei l'unico utente dell'applicazione, considerando che sono consentite fino a 200 connessioni simultanee, c'è qualcosa di strano in corso ...


Bene, pensando a " troppe connessioni " e " max_connections " ...

Se ricordo bene, max_connections non limita il numero di connessioni che tu puoi aprire su MySQL Server, ma il numero totale di connessioni che può essere aperto a quel server, da chiunque si colleghi ad esso .

Citando la documentazione di MySQL su Troppe connessioni :

  

Se ricevi troppe connessioni   errore quando si tenta di connettersi a   server mysqld, questo significa tutto   le connessioni disponibili sono utilizzate da   altri clienti.

     

Il numero di connessioni consentite è   controllato da max_connections   variabile di sistema. Il suo valore predefinito è   100. Se devi supportare più connessioni, dovresti impostarne una più grande   valore per questa variabile.

Quindi, in realtà, il problema potrebbe non provenire da te né dal tuo codice (che in realtà sembra a posto) : potrebbe " solo " sia che non sei il solo a provare a connetterti a quel server MySQL (ricorda, " hosting condiviso ") , e che ci sono troppe persone che lo usano contemporaneamente ...

... E se ho ragione ed è così , non c'è niente che tu possa fare per risolvere il problema: fintanto che ci sono troppi database / utenti su quel server e quel max_connection è impostato su 200, continuerai a soffrire ...


Come sidenote: prima di tornare su GoDaddy chiedendogli questo, sarebbe bello se qualcuno potesse confermare ciò che ho appena detto ^^

Altri suggerimenti

Ho avuto circa 18 mesi di tempo per affrontare questo ( http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections- errore / )

Le soluzioni che avevo (che si applicavano a te) alla fine erano:

  1. ottimizza il database in base a MySQLTuner .
  2. deframmenta le tabelle settimanalmente in base a questo post

Deframmenta lo script bash dal post:

#!/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

Assicurati di non utilizzare connessioni permanenti. Questa è di solito una cattiva idea ..

Se ce l'hai .. Al massimo dovrai supportare tutte le connessioni che hai i processi apache. Sei in grado di modificare l'impostazione max_connections?

Sei completamente sicuro che il server database sia completamente dedicato a te?

Accedi alla base dati come root e usa " MOSTRA ELENCO PROCESSI " per vedere chi è connesso. Idealmente aggancialo al tuo sistema di monitoraggio per visualizzare quante connessioni ci sono nel tempo e avvisa se ce ne sono troppe.

Le connessioni al database massime possono essere configurate in my.cnf, ma attenzione per esaurire la memoria o lo spazio degli indirizzi.

Se hai accesso alla shell, usa netstat per vedere quanti socket sono aperti al tuo database e da dove provengono.

Su Linux, digitare:

netstat -n -a |grep 3306

Su Windows, digitare:

netstat -n -a |findstr 3306

La soluzione potrebbe essere una di queste, mi sono imbattuto in questo in un test MCQA, anche se non capivo quale fosse giusto!

Impostalo in my.cnf " set-variabile = max_connections = 200 "

Esegui il comando " SET GLOBALmax_connections = 200 "

Utilizzare sempre la funzione mysql_connect () per connettersi al server mysql

Utilizzare sempre la funzione mysql_pconnect () per connettersi al server mysql

I seguenti sono possibili soluzioni:

1) Aumenta l'impostazione di connessione massima impostando la variabile globale in mysql.

set global max_connection=200;

Nota: aumenterà il carico del server.

2) svuota il pool di connessioni come di seguito:

FLUSH HOSTS;

3) controlla la tua ProcessList ed elimina la processlist specifica se non ne vuoi una.


Puoi fare riferimento a questo: -

link all'articolo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top