Question

J'ai une configuration d'instance Tomcat mais la connexion à la base de données que j'ai configurée dans context.xml continue de mourir après des périodes d'inactivité.

Lorsque je vérifie les logs, j'obtiens l'erreur suivante :

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException :Le dernier paquet reçu avec succès du serveur était il y a 68051 secondes.Le dernier paquet envoyé avec succès au serveur était il y a 68051 secondes, ce qui est plus long que la valeur configurée du serveur de 'wait_timeout'.Vous devez envisager l'expiration et / ou tester la validité de connexion avant l'utilisation dans votre application, l'augmentation des valeurs configurées du serveur pour les délais de temps ou l'utilisation de la propriété Connector / J Connexion 'AutoreConnect = true' pour éviter ce problème.

Voici la configuration dans context.xml :

<Resource name="dataSourceName" 
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="username" 
        password="********"
        removeAbandoned = "true"
        logAbandoned = "true"
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

j'utilise autoReconnect=true comme l'erreur le dit, mais la connexion continue de mourir.Je n’ai jamais vu cela se produire auparavant.

J'ai également vérifié que toutes les connexions à la base de données sont correctement fermées.

Était-ce utile?

La solution

Documentation Tomcat

DBCP utilise le pool de connexions à la base de données Jakarta-Commons.Il s'appuie sur un certain nombre de composants de Jakarta-Commons :

* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

Cet attribut peut vous aider.

removeAbandonedTimeout="60"

J'utilise les mêmes éléments de regroupement de connexions et je définis ces propriétés pour éviter que la même chose ne soit tout simplement pas configurée via Tomcat.Mais si la première chose ne fonctionne pas, essayez-les.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

Autres conseils

Juste pour clarifier la cause réelle de cela.MySQL met fin par défaut aux connexions ouvertes après 8 heures d'inactivité.Cependant, le pool de connexions à la base de données conservera les connexions plus longtemps que cela.

Ainsi, en définissant timeBetweenEvictionRunsMillis=300000, vous demandez au pool de connexions d'exécuter les connexions et d'expulser et de fermer celles inactives toutes les 5 minutes.

L'option RemoveAbandoned est obsolète depuis DBCP 1.2 (bien que toujours présent dans la branche 1.3). IciC'est une explication non officielle.

Je ne sais pas si la réponse ci-dessus fait fondamentalement la même chose, mais certains de nos systèmes utilisent la connexion DB environ une fois par semaine et j'ai vu que nous fournissons un indicateur -Otimeout ou quelque chose du genre à MySQL pour définir la connexion. temps mort.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top