web-dev-qa-db-fra.com

Pourquoi autoReconnect = true ne semble-t-il pas fonctionner?

J'utilise JDBC pour me connecter à un serveur MySQL (pas de pool de connexion je pense). Dans l'URL de connexion, j'ai autoReconnect=true

Mais ma connexion arrive à expiration. J'ai même vérifié conn.isClosed() et son faux. Mais lorsque j'essaie d'utiliser la connexion, j'obtiens l'exception suivante.

 com.mysql.jdbc.CommunicationsException: Échec de la liaison de communication en raison d'une exception sous-jacente: 
 
 ** COMMENCER L'EXCEPTION NESTÉE ** 
 
 Java. net.SocketException 
 MESSAGE: Le logiciel a causé l'abandon de la connexion: erreur d'écriture du socket 
 
 STACKTRACE: 
 
 Java.net.SocketException: Le logiciel a provoqué l'abandon de la connexion : erreur d'écriture de socket 
 ... 

Je sais qu'en Java 1.6 vous pouvez utiliser conn.isValid(0) pour vérifier la connexion, mais j'utilise Java 1.5

Existe-t-il un moyen de s'assurer que le délai ne s'arrête pas? Ou vais-je devoir passer à Java 1.6?

32
Pyrolistical

J'ai eu le même problème et c'était absolument exaspérant. Voici ce que les docs disent sur le site MySQL (c'est moi qui souligne)

Le conducteur doit-il essayer de rétablir les connexions périmées et/ou mortes? Si activé, le pilote lèvera une exception pour les requêtes émises sur une connexion périmée ou morte, qui appartiennent à la transaction en cours, mais tentera de se reconnecter avant la prochaine requête émise sur la connexion dans une nouvelle transaction . L'utilisation de cette fonctionnalité n'est pas recommandée, car elle a des effets secondaires liés à l'état de la session et à la cohérence des données lorsque les applications ne gèrent pas correctement les SQLExceptions, et est uniquement conçue pour être utilisée lorsque vous ne parvenez pas à configurer votre application pour gérer les SQLExceptions résultant de morts et les connexions périmées correctement. Vous pouvez également étudier la possibilité de définir la variable de serveur MySQL "wait_timeout" sur une valeur élevée plutôt que sur la valeur par défaut de 8 heures.

D'après mon expérience, il ne semble pas que la fonctionnalité "se reconnecter à la prochaine requête" ait fonctionné non plus, mais j'utilisais MySQL 4.0, ce qui pourrait être la raison de cela.

J'ai fini par écrire un mini-framework qui intercepte les exceptions, vérifie cette erreur spécifique et tente de se reconnecter et de réessayer la requête si possible.

[~ # ~] eta [~ # ~] : Ce lien fournit un peu plus d'informations et indique qu'autoReconnect va probablement être supprimé à l'avenir de toute façon.

33
Eric Petroelje

autoReconnect lève toujours l'exception afin que vous puissiez choisir de faire quelque chose à propos de la situation si vous le souhaitez. Si vous l'attrapez, vous devriez constater que la connexion est de nouveau là après. (Il y a un peu plus de complexité si vous êtes dans une transaction - votre transaction actuelle est à peu près morte.)

2
chaos