web-dev-qa-db-fra.com

La connexion avec MySql est interrompue automatiquement. Comment configurer Connector/J correctement?

J'ai lu ce conseil du message d'erreur:

Vous devriez envisager une date d'expiration et/ou test de la validité de la connexion avant utilisation dans votre application, augmenter le serveur configuré valeurs pour les délais d'attente du client, ou en utilisant la propriété Connector/J connection 'autoReconnect = true' pour éviter cela problème.

J'utilise Spring et JPA. Où devrais-je configurer Connector/J? (en persistence.xml ou en configuration de printemps entityManagerFactory ou en configuration de printemps dateSource ou ailleurs 

45
Roman

Le texte décrit trois solutions pour empêcher les abandons de connexion:

  1. Configurez la chaîne de connexion avec autoReconnect=true. Il s'agit d'une propriété de la chaîne de connexion URL, qui fonctionne au niveau du pilote. Vous devez modifier la chaîne de connexion dans la configuration de la source de données.

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
  2. Augmenter le délai d'attente. C'est normalement une propriété de la base de données. Vous pouvez augmenter cette valeur pour voir si vous obtenez moins d'abandon de connexion.

  3. Configurez le pool de connexions pour tester la validité de la connexion. Cela se fait à la piscine, pas au niveau du pilote. Cela dépend de l'implémentation de la source de données que vous utilisez. Mais il devrait être configurable dans la propriété de la source de données, si vous utilisez un pool, par exemple. c3p0 .

Commentaires supplémentaires:

  • La source de données/pool peut également avoir un délai d'expiration, qui correspond au temps pendant lequel une connexion inactive reste dans le pool. Ne pas confondre avec le délai d'attente de la base de données.
  • Il y a plusieurs façons de tester la validité d'une connexion. Une méthode courante consiste à avoir une table de test factice. Le pool émettra une sélection sur la table de test factice pour voir si la connexion est toujours correcte. 
62
ewernli

AutoReconnect n'est pas recommandé. De MySQL ici

Le conducteur doit-il essayer de rétablir des connexions obsolètes et/ou mortes? Si cette option est activée, le pilote lève une exception pour les requêtes émises sur une connexion obsolète ou morte, qui appartient à la transaction en cours, mais tentera de vous reconnecter avant la prochaine requête émise sur le connexion dans une nouvelle transaction. L'utilisation de cette fonctionnalité n'est pas recommandé, car il a des effets secondaires liés à l'état de session et à cohérence des données lorsque les applications ne gèrent pas SQLExceptions correctement et est conçu pour être utilisé uniquement lorsque vous êtes incapable de configurez votre application pour gérer les exceptions SQLExceptions résultant de dead et les connexions périmées correctement. Alternativement, en dernière option, investiguer en définissant la variable serveur "wait_timeout" sur une valeur élevée valeur, plutôt que le défaut de 8 heures.

18
Gaurav Agarwal

Je suis passé par de nombreuses solutions et mon problème a été résolu, mais après un certain temps, la connexion est expirée ou déconnectée. Après 2 à 3 jours, j'ai obtenu une solution qui résout mon problème. 

de nombreuses solutions suggèrent d'utiliser autoReconnect = true mais quand je parcourais la documentation. J'ai vu le texte suivant dans la source décrivant le paramètre autoReconnect: 

L'utilisation de cette fonctionnalité n'est pas recommandée car elle a des effets secondaires liés à l'état de session et à la cohérence des données. 

Quand j'ai regardé dans le code d'Hibernate. Le mécanisme de connexion de base d’Hibernate ne prend pas en charge la reconnexion, il faut utiliser le pool de connexions H3C0 (qui n’a pas toujours pris en charge la reconnexion).

Mais une fois que l’on utilise H3C0, le comportement par défaut semble être que, si la connexion est morte, l’utilisateur voit et commet une erreur - mais au moins, il se reconnecte pour la demande suivante. Je suppose qu'une seule erreur vaut mieux que des erreurs infinies, mais pas autant que zéro. Il s'avère que vous avez besoin de l'optiontestConnectionOnCheckout, ce que la documentation ne recommande pas, car tester la connexion avant une demande peut entraîner une baisse des performances. Le logiciel doit d’abord fonctionner, mais ensuite, il doit fonctionner rapidement.

Donc, pour résumer, pour obtenir une connexion au «travail» (que je définis comme incluant le traitement des connexions abandonnées en se reconnectant sans erreur): Dans «hibernate.cfg.xml»:

  <!-- hibernate.cfg.xml -->
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.max_statements">50</property>
    <!-- no "connection.pool_size" entry! -->

Créez ensuite un fichier «c3p0.properties» qui doit figurer à la racine du chemin de classe (c’est-à-dire qu’il n’est pas possible de le remplacer pour des parties particulières de l’application):

c3p0.properties

c3p0.testConnectionOnCheckout = true

Si cette solution ne fonctionne pas, il existe plusieurs solutions possibles: - 

1. Add

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

 Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml:

<property name="hibernate.c3p0.validate">true</property>

    Also checkout the last post on this page:

    https://forum.hibernate.org/viewtopic.php?p=2399313

    If all these not work than go [more][1] and read in detail


  [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html
0
Ravindra