2009-12-08 4 views
7

J'ai configuré tomcat pour utiliser un pool de connexions, mais après le délai mysql sur les connexions, les connexions précédemment ouvertes dans le pool ne sont pas ouvertes. Voici à quoi ressemble mon fichier context.xml:Le pool de connexions JDBC ne rouvre pas Connexions dans tomcat

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

Comme vous pouvez le voir, j'ai inclus autoReconnect comme étant vrai, mais ce n'est pas le cas. J'ai vérifié le processus sur la base de données au bout de 8 heures, ce qui définit le délai d'expiration. Si quelqu'un peut vous aider alors s'il vous plaît aidez-moi car cela a été un problème pendant quelques mois, mais vient de surgir comme urgent en raison de mon logiciel en direct bientôt.
Merci à l'avance Dean Chester

Répondre

6

Essayez d'ajouter un attribut de requête de validation. Cela devrait avoir pour effet de fermer et de rouvrir automatiquement la connexion après un timeout comme ceci:

validationQuery="SELECT 1" 
+0

J'ai obtenu cette solution sur un autre forum et j'ai déjà fait cela. – Dean

+0

validationQuery n'est pas suffisant. Veuillez lire: http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html –

+0

Les propriétés 'testWhileIdle' et' test-on-emprunter' utiliseront validationQuery –

1

Depuis c'est urgent et pour la production, je vous suggère d'avoir à regarder un pool de connexion décente tels que c3p0. Il est plus robuste et fiable et peut mieux gérer les délais.

5

D'abord, supprimez la propriété autoReconnect. Vous n'avez pas besoin de cela avec un pool de connexion et cela peut causer des problèmes.

Deuxièmement, assurez-vous que vous près toutes les ressources (Connection, Statement et ResultSet) dans votre code JDBC dans le bloc finally. Je ne suis pas sûr que cela s'applique à votre cas, mais une idée fausse commune parmi les démarreurs est qu'ils semblent penser que vous n'avez pas besoin de fermer ces ressources en cas de connexions groupées. C'est faux. Une connexion en gestion commune est un wrapper (décorateur) autour d'une connexion qui a une méthode close() légèrement modifiée qui ressemblent à peu près comme

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 

Avec d'autres mots, les fermer permet de libérer la connexion mis en commun afin qu'il puisse être remis dans la piscine pour une réutilisation future. Si vous acquérez des connexions sans les fermer, le pool va manquer de connexions tôt ou tard.

0

Avec votre configuration, il n'est pas censé créer une autre connexion si elle est inactive. Essayez d'ajouter

minIdle="3" 

Avec ce paramètre, DBCP maintiendra 3 connexions à tout moment.

Nous voyons exactement le même comportement avec l'un des serveurs légèrement utilisés. En raison du délai de connexion par défaut de 8 heures, nous ne voyons aucune connexion lorsque nous arrivons le matin. C'est ce que nous attendions. Cependant, nous voyons parfois une connexion périmée et la première demande échouera. Pour contourner ce problème, vous devez ajouter les attributs suivants,

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000" 
Questions connexes