Pourquoi ne Hibernate/JDBC/MySQL supprimer des connexions après un jour ou deux?
J'ai plusieurs serveur de processus que de temps à répondre aux messages que les clients et d'effectuer des transactions en lecture seule.
Après quelques jours que les serveurs sont en cours d'exécution, ils cessent de fonctionner correctement, et quand je vérifie, il s'avère qu'il y a tout un tas de messages à propos de la connexion est fermée.
Quand je l'ai vérifié, il s'est avéré que hibernate par défaut fonctionne dans une sorte de mode de développement, où les connexions sont abandonné au bout de quelques heures, et j'ai commencé à utiliser c3po pour le regroupement de connexion.
Cependant, même avec c3po, j'ai ce problème sur 24 heures ou plus après les serveurs sont démarrés.
Quelqu'un a rencontré ce problème et sait comment le résoudre? Je ne suis pas assez familier avec les subtilités de la configuration d'hibernate.
OriginalL'auteur Uri | 2008-11-06
Vous devez vous connecter pour publier un commentaire.
Le pilote JDBC MySQL après 8 heures d'inactivité et les gouttes de la connexion.
Vous pouvez définir
autoReconnect=true
dans votre JDBC URL, ce qui incite le conducteur à se reconnecter si vous essayez de requête après il s'est déconnecté. Mais cela a des effets secondaires, par exemple l'état de session et les transactions ne peuvent pas être maintenue sur une nouvelle connexion.Si vous utilisez
autoReconnect
, JDBC connexion est rétablie, mais il n'est pas automatiquement ré-exécuter votre requête qui a obtenu l'exception. Si vous avez besoin de l'attraperSQLException
dans votre application et réessayer requêtes.Lire http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html pour plus de détails.
Je voudrais le configurer dans l'URL JDBC.
Il n'est pas recommandé d'utiliser
autoReconnect
bien car il a des effets secondaires indésirables. Au lieu de cela, vous devriez regarder dans l'augmentation dewait_timeout
sur le serveur pour une valeur élevée de la valeur par défaut de 8 heures. Référence: dev.mysql.com/doc/connector-j/5.1/en/...OriginalL'auteur Bill Karwin
MySql, fondamentalement, délais d'expiration par défaut dans 8 heures.
J'ai eu la même exception & a résolu le problème après 3 mouvementée jours.Vérifiez si vous utilisez je hibernate3. Dans cette version, il est nécessaire de mentionner explicitement la connexion nom de la classe. Vérifiez également si le pot est dans le classpath. Procédure de vérification de la & commentaires en lien ci-dessous
http://hibernatedb.blogspot.com/2009/05/automatic-reconnect-from-hibernate-to.html
Supprimer
autoReconnect=true
OriginalL'auteur
Je voudrais suggérer que, dans presque n'importe quel client/serveur, c'est une mauvaise idée de laisser les connexions ouvertes quand ils ne sont pas nécessaires.
Je pense en particulier à propos de DB2/z connexions, mais il s'applique également à tous les serveurs (base de données et autres). Ces connexions consommer des ressources au niveau du serveur qui pourraient être mieux utilisées ailleurs.
Si vous teniez les connexions ouvertes dans un environnement d'entreprise où des dizaines de milliers de clients de se connecter à la base de données, vous serait probablement de même apporter un mainframe à ses genoux.
Je suis tout à fait pour l'idée de regroupement de connexion, mais pas tellement pour l'idée d'essayer de maintenir les sessions ouvertes pour toujours.
Mon conseil serait comme suit:
1/Avez trois sortes de connexions dans votre pool de connexion:
2/votre pool de connexion de maintenir un petit nombre de connexions, le minimum de N et maximale de M. N peut être ajustée en fonction de la vitesse de pointe à laquelle votre demande des clients, des connexions. Si le nombre de connexions jamais tombe à zéro, vous avez besoin d'un plus grand N.
3/Quand un client veut une connexion, de leur donner un du prêt (en la rendant active), puis immédiatement à ouvrir un nouveau si maintenant il y en a moins de N prêt (mais ne faites pas le client d'attendre pour cela de compléter, ou vous perdrez l'avantage de mettre en commun). Cela garantit qu'il y aura toujours au moins N prêt connexions. Si aucun n'est prêt lorsque le client veut un, ils devront attendre tout autour de vous en créer un nouveau.
4/Lorsque le client se termine avec une connexion active, il retourne à l'état prêt s'il y a moins de M ready connexions. Sinon le fermer. Cela vous évite d'avoir plus de M ready connexions.
5/recycler Périodiquement le prêt connexions afin d'éviter rassis connexions. Si il n'y a plus de N prêt connexions, il suffit de fermer la plus vieille de connexion. Sinon, le fermer et ré-ouvrir un autre.
Cela a l'avantage d'avoir assez de prêt ET jeune connexions disponibles dans votre pool de connexion sans surcharger le serveur.
Le point entier de laisser certains s'ouvrir si de réduire la latence pour un client de votre pool de connexion. Ils ne veulent pas attendre tout autour de vous en établir un nouveau. Bien que vous pouvez obtenir l'effet désiré par le paramètre N à zéro, je suppose.
Mon problème est que je suis en utilisant hibernate. Autant que je sache, je ne suis pas contrôler les connexions directes. Ne devrait pas c3po ou la connexion pooler ou veille prolongée elle-même être fermeture des connexions lorsqu'ils sont au ralenti?
OriginalL'auteur paxdiablo
J'ai modifié mon fichier de configuration hibernate par l'ajout de ces lignes et il fonctionne pour le moment:
Je pense que l'utilisation de c3p0 piscine est mieux et recommandée mais cette solution fonctionne pour l'instant et ne présentent pas de fourmi problème.
Je laisse le Tomcat Sur pour 24 heures et la connexion n'était pas perdu .
Merci d'essayer .
OriginalL'auteur Bourkadi