Mysql
 sql >> Database >  >> RDS >> Mysql

Come impostare un timeout per la query MySQL utilizzando C API

Ok, ho trovato una soluzione. Grazie a Will e PRR ( il mio collega ).

non posso avviare un nuovo thread su ogni query, poiché si tratta di un'applicazione in tempo reale, che dovrebbe elaborare oltre 1000 messaggi al secondo..(comunque, grazie a R.. per l'idea).

Inoltre, non è stato possibile interrompere la connessione tramite la libreria, né annullare/chiudere la query, poiché il problema era nel server DB..

Ed ecco una soluzione di forza bruta, ma ancora molto meglio che _EXIT( FAILURE ) :Ecco la domanda correlata:"Come forzare la chiusura socket su Linux?" - quindi, ho appena chiuso il socket usando una chiamata di sistema.

NOTA importante :(grazie Will) - Si è scoperto che il nostro wrapper della libreria MySQL ha il flag "fail-safe", quindi su socket chiuso (o altro errore critico), cerca di "risolvere" il problema, quindi riapre il socket , da solo, nel mio caso. Quindi, ho appena disattivato questa opzione e ora va tutto bene - l'esecuzione è terminata a causa di un'eccezione - questo è il modo "più morbido" per farlo.
Questo dovrebbe essere fatto attraverso un altro thread, ovviamente:un timer, per esempio.

MODIFICA: I timeout funzionano davvero per le versioni successive alla 5.0.25. Ma, almeno su RHEL4 e RHEL5, i timeout sono triplicati per qualche motivo! Ad esempio, se alcuni dei timeout sono impostati su 20 secondi, il timeout reale è di circa 60 secondi.
Inoltre, un'altra cosa importante è che questi timeout (come qualsiasi altra opzione) DEVONO essere impostato dopo mysql_init e prima mysql_connect o mysql_real_connect .