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?
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.
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.)