Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible de se connecter à la base de données après quelques temps de déploiement sur le serveur

Dans vos propriétés de configuration, vous avez utilisé la propriété c3p0 maxIdleTime, mais les propriétés c3p0 sont configurées à l'aide de c3p0. préfixe ou hibernate.c3p0. . Notez que l'activation de l'un des c3p0 properties active automatiquement le fournisseur de connexion correspondant par l'heuristique d'hibernation. Dans le journal, on ne voit pas que vous utilisez c3p0. Si vous n'êtes pas configuré de sources de données, Hibernate utilisera hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider . Ce fournisseur de connexion a un pool de connexion rudimentaire intégré pour lequel vous pouvez définir un hibernate.connection.pool_size , mais il est utilisé uniquement à des fins de développement. Ne l'utilisez jamais dans l'environnement de production.

Vous pourriez avoir une discussion interminable sur le sujet Comment réparer java.net.SocketException :Broken pipe . Après un certain temps, vous vous rendrez compte que vous êtes resté ouvert connexions dans le pool, qui sont soudainement fermées de l'autre côté pour les raisons suivantes :

  • Les pare-feu ou les routeurs peuvent bloquer les connexions inactives (le protocole client/serveur MySQL ne fonctionne pas).
  • Le serveur MySQL peut fermer les connexions inactives qui dépassent le wait_timeout ouinteractive_timeout seuil.

Pour aider à résoudre ces problèmes, les conseils suivants peuvent être utilisés :

  • Une version récente (5.1.13+) du pilote JDBC est utilisée.
  • Assurez-vous que wait_timeout et interactive_timeout sont réglés suffisamment haut. Vérifiez si interactiveClient est utilisé.
  • Assurez-vous que tcpKeepalive est activé.
  • Assurez-vous que tous les paramètres configurables de délai d'expiration du pare-feu ou du routeur autorisent le temps d'inactivité de connexion maximal prévu.
  • Assurez-vous que les connexions sont valides lorsqu'elles sont utilisées à partir du pool de connexions. Utilisez une requête qui commence par /* ping */ pour exécuter un ping léger au lieu d'une requête complète. Notez que la syntaxe du ping doit être exactement celle spécifiée ici.
  • Validez explicitement la connexion avant de l'utiliser si la connexion est restée inactive pendant une période prolongée.
  • Réduire la durée d'inactivité d'un objet de connexion pendant l'exécution d'une autre logique d'application.

Pour vous conformer à certaines de ces options, vous feriez mieux d'utiliser un pool de connexions que vous pouvez utiliser avec Hibernate. Hibernate prend en charge commons-dbcp, c3p0 et proxool. Vous pouvez également configurer la source de données JNDI sur le serveur Web à utiliser avec la mise en veille prolongée, elle dispose d'un pool de connexions. Voir Chapitre 7 Regroupement de connexions avec Connector/J .

Si vous souhaitez configurer Hibernate avec c3p0, vous devriez lire ceci How-To configure the C3P0ConnectionPool">How-To configure the C3P0 connection pool . Pour un exemple de configuration dbcp, vous devriez vérifier ce post MySQL, Hibernate and Broken Pipe Exception . Quelle que soit la mise en commun des connexions que vous utiliserez, c'est à vous de décider.