Domanda

Sto usando Pylons (un framework Python) per servire una semplice applicazione web, ma sembra morire di tanto in tanto, con questo nel registro degli errori: (2006, 'MySQL server has gone away')

Ho fatto un po' di controlli e ho visto che ciò era dovuto al fatto che le connessioni a MySQL non venivano rinnovate.Questo non dovrebbe essere un problema però, perché il sqlalchemy.pool_recycle nel file di configurazione dovrebbe mantenerlo automaticamente in vita.L'impostazione predefinita era 3600, ma l'ho richiamato 1800 a causa di questo problema.Ha aiutato un po', ma 3600 Dovrebbe stare bene secondo i documenti.Gli errori si verificano ancora con una certa regolarità.Non voglio abbassarlo troppo però e DOS il mio database :).

Forse qualcosa nella mia configurazione MySQL è sciocco?Non so dove guardare esattamente.

Altri dettagli rilevanti:

  Python 2.5
  Pylons: 0.9.6.2 (w/ sql_alchemy)
  MySQL: 5.0.51
È stato utile?

Soluzione

Penso di averlo risolto.Si è scoperto che ho avuto un semplice errore di configurazione.Il mio file ini diceva:

sqlalchemy.default.url = [connection string here]
sqlalchemy.pool_recycle = 1800

Il problema è che il mio environment.py file dichiarava che il motore avrebbe mappato solo le chiavi con il prefisso: sqlalchemy.default COSÌ pool_recycle è stato ignorato.

La soluzione è semplicemente cambiare la seconda riga dell'ini in:

sqlalchemy.default.pool_recycle = 1800

Altri suggerimenti

Potresti voler controllare le variabili di timeout di MySQL:

show variables like '%timeout%';

Probabilmente ti interessa wait_timeout (meno probabile ma possibile: interactive_timeout).Su Debian e Ubuntu, i valori predefiniti sono 28800 (MySQL interrompe le connessioni dopo 8 ore), ma forse il valore predefinito per la tua piattaforma è diverso o chi amministra il server ha configurato le cose in modo diverso.

AFAICT, pool_recycle in realtà non mantiene attive le connessioni, le fa scadere da solo prima che MySQL le uccida.Non ho familiarità con i tralicci, ma se si causa l'intermittenza delle connessioni, eseguire a SELECT 1; è un'opzione che li manterrà in vita al costo di un carico del server praticamente nullo e di un traffico di rete minimo.Un ultimo pensiero:riesci in qualche modo a utilizzare una connessione che i tralicci pensano sia scaduta?

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