MySQL: cambiare il timeout della connessione

Alcuni script potrebbero richiedere tempi di elaborazione notevoli. Come allungare all’occorrenza la vita di una connessione MySQL?

Come funziona la comunicazione

Quando ti colleghi ad un database MySQL, si apre una connessione client-server. Questa connessione rimane attiva fin tanto che c’è un interazione tra client e server. Quando non ci sono più interazioni, MySQL attende una nuova richiesta dal client entro un certo numero di secondi. Se entro questa finestra temporale non riceve alcuna richieste, la connessione viene chiusa.

Normalmente questo non è un problema, perché la connessione può essere riaperta e puoi continuare le operazioni. Con un’opportuna implementazione, tutto questo può avvenire in maniera del tutto trasparente. In verità, il 99% delle web application ha script che terminano l’esecuzione dei comandi abbondantemente all’interno della finestra temporale di default di MySQL.

Quando crea un problema

In alcuni casi la connessione non deve andare in timeout perché questo genera un problema serio. Un caso è quando la connessione viene chiusa durante una transazione.

Una transazione in MySQL è schematizzabile così:

Per “altri comandi” si intendono non solo comandi SQL a cascata, ma anche elaborazioni a livello di linguaggio di programmazione. Se la connessione va in timeout durante questa fase, cioè durante l’esecuzione di “altri comandi”, al momento dell’esecuzione della commit il sistema va in errore perché normalmente MySQL fa l’auto commit della transazione.

Come cambiare il timeout

Il cambio della durata del timeout di una connessione lo si fa modificando il valore della variabile di sessione wait_timeout. Questa variabile è di tipo integer ed il valore temporale va espresso in secondi. Quindi, se vuoi che la connessione attenda 2 minuti prima di chiudere la connessione per inattività, dovrai eseguire il seguente comando SQL:

Il valore massimo cambia in base al sistema operativo e, essendo una variabile di sessione, il comando va eseguito ogni qual volta si apre una nuova connessione col database.

P.S.
Il problema dell’auto commit della transazione può essere risolto anche con la modifica della variabile di sessione autocommit. Per maggiori informazioni: https://dev.mysql.com/doc/refman/5.7/en/commit.html.

Add a Comment