PDA

View Full Version : [JAVA] Mysql - Connection was implicitly closed by the driver


hdm
11-02-2012, 20:35
Salve,
ho sviluppato un applicazione in java che fa uso di mysql ma purtroppo, dopo ore di utilizzo, ho riscontrato un problema con la connessione a mysql stesso.

Quadro generale del lavoro che svolge l'applicazione:
L'applicazione è un server che gira in background e lavora soltanto quando un client si connette ad esso per usufruire dei suoi servizi.
Ad ogni client connesso il server dedica un Thread, all'interno del quale viene aperta una nuova connessione al db e stanziati oggetti necessari ad offrire determinati servizi.
Durante la comunicazione con un client, il server fa uso di mysql per registrare parte dei dati che il client stesso gli manda, effettua elaborazioni e risponde al client...

Nel Thread principale, all'avvio del server, viene aperta una connessione al db necessaria al server per le sue operazioni, esterne ad ogni operazione aperta con un client.
Quest'applicazione sta praticamente accesa 24h su 24h, e dopo ore di utilizzo ho iniziato ad avere questo errore

No operations allowed after connection closed.Connection was implicitly closed by the driver.

e il server praticamente non mi permetteva di far più nulla perché non aveva connessione al db a quanto pare.

L'errore dice che non è possibile effettuare operazioni dopo che la connessione è stata chiusa, ed è stata chiusa dal driver... ma perché? presumo per un timeout... o ci sono altri casi? è possibile che sia andato in crash il driver?
conoscete un modo per risolvere.... ho già cercato un giro su google ma non riesco a trovare nulla di chiaro

Uso JConnector per connettermi a mysql

Se non sbaglio le connessioni vengono chiuse automaticamente da mysql dopo 8 ore di inattività (wait_timeout)... Pensando il problema fosse questo, ho cercato di ricreare la situazione impostando un wait_timeout di 4 secondi.
A questo punto apro una connessione con DB, una sleep attende 6 secondi prima di proseguire con il codice e con l'esecuzione di una query, dopo i 6 secondi in effetti la connessione sembra che sia stata chiusa ma ottengo un altro tipo errore

The last packet successfully received from the server was 6.020 milliseconds ago. The last packet sent successfully to the server was 18 milliseconds ago.

non so più dove sbattere la testa... c'è qualcuno che può darmi una mano o che conosce il reale motivo del primo errore che ottengo (No operations allowed after connection closed.Connection was implicitly closed by the driver.)

grazie mille per il vostro aiuto

VICIUS
12-02-2012, 07:07
Puoi provare ad usare isValid(timeout) per sapere se la connessione è ancora valida prima di cominciare a fare qualcosa nei thread. Se ritorna false devi riaprirla. Però visto che mi pare di capire che questa connessione sia condivisa da più thread non credo che sia la soluzione giusta. Se non hai limiti di latenza ti conviene lasciare che ogni thread apra una sua connessione a mysql quando gli serve e poi chiuderla immediatamente.

hdm
12-02-2012, 08:39
ciao,
grazie per il tuo aiuto:)... in effetti funziona già così, il server crea una nuova connessione ad ogni client che si connette, quindi ogni thread ha già una sua connessione, che viene chiusa alla chiusura del thread stesso.
La connessione al db che viene creata nel thread principale (nel main per capirci), serve soltanto al server per alcune sue operazioni esterne ad ogni thread.
Presumo che sia proprio la connessione che usa il server a cadere... sto cercando un modo per ricostruire forzatamente lo scatenarsi di questo evento ma non ci riesco... più che altro per conoscerne il reale motivo