2008-08-19 13 views
13

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é.Java + Tomcat, Connexion de base de données Mourir?

Quand je vérifie les journaux que je reçois l'erreur suivante:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Le dernier paquet reçu avec succès depuis le serveur was68051 secondes il y a . Le dernier paquet envoyé avec succès au serveur était 68051 secondes auparavant, ce qui est plus long que la valeur configurée par le serveur de 'wait_timeout'. Vous devez envisager d'expirer et/ou de tester la validité de la connexion avant de l'utiliser dans votre application, en augmentant les valeurs configurées par le serveur pour les délais d'attente client ou en utilisant la propriété de connexion Connector/J 'autoReconnect = true' pour éviter ce problème.

Voici la configuration 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 = ture comme l'erreur dit de faire, mais la connexion cesse de flancher. Je n'ai jamais vu cela arriver avant.

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

Répondre

8

Tomcat Documentation

DBCP utilise la connexion de base de données Jakarta-communes Pool. Il repose sur le nombre de composants Jakarta-Commons:

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

Cet attribut peut vous aider. J'utilise le même regroupement de connexions et je mets ces propriétés pour empêcher la même chose que celle-ci n'est pas configurée via TomCat. Mais si la première chose ne fonctionne pas, essayez ceci.

testWhileIdle=true 
timeBetweenEvictionRunsMillis=300000 
+0

Nice. J'ai mis les paramètres dans context.xml, et je vais le laisser reposer pendant 24 heures. Si cela ne fonctionne pas, je n'accepterai pas la réponse. Mais ça a l'air prometteur! Merci! –

0

Je ne sais pas si la réponse ci-dessus fait essentiellement la même chose, mais certains de nos systèmes utilisent la connexion DB environ une fois par semaine et je l'ai vu que nous fournissons un drapeau -Otimeout ou quelque chose de ce triez vers mysql pour définir le délai d'expiration de la connexion.

5

Juste pour clarifier ce qui cause réellement cela. Par défaut, MySQL termine les 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. Par conséquent, en définissant timeBetweenEvictionRunsMillis = 300000, vous demandez au pool de connexions d'exécuter les connexions et d'expulser et de fermer les connexions inactives toutes les 5 minutes.

+0

Quel est le nom de cette propriété? Je voudrais vérifier. "thread_pool_idle_timeout = 60" est tout ce que je vois. – mass

+0

@mass Je n'en ai aucune idée. Ma réponse ci-dessus a 7 ans et je n'ai pas beaucoup utilisé Tomcat ou Servlet Resource depuis quelques années maintenant.Autant que je sache, timeBetweenEvictionRunsMillis est une propriété de la balise Resource dans context.xml et thread_pool_idle_timeout est une clé de fichier .property. –

+0

En ce moment, pour autant que je sache, mettre en place timeBetweenEvictionRunsMillis lance toujours le sweeper de connexion pour le pool de sources de données jdbc. thread_pool_idle_timeout était cependant un paramètre MySQL auquel je faisais référence. Je doute que les valeurs par défaut soient inférieures à 8 heures mais merci de répondre quand même. On dirait que la solution acceptée a fonctionné pour le PO, je vais essayer. – mass

1

L'option removeAbandoned est déconseillée à partir de DBCP 1.2 (bien que still present dans la branche 1.3). Here est une explication non-officielle.