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
Le texte décrit trois solutions pour empêcher les abandons de connexion:
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"
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.
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:
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.
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.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