L'application web (Tomcat-jdbc) a Regroupé DB connexion jeter abandonner exception
J'ai été la navigation pendant un certain temps, et de mâcher mon chapeau dans le processus, mais ne peut pas trouver une correspondance exacte à mon problème.
Pour faire court, je suis une superbe trace de la pile (org.apache.tomcat.jdbc.piscine.ConnectionPool abandonner) après 60 secondes d'inactivité, ce qui est un comportement normal pour un couple de côté de serveur de threads.
J'utilise Tomcat Connexion JDBC mise en commun (org.apache.tomcat.jdbc.piscine.Source de données) directement
La Trace De Pile:
Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.piscine.ConnectionPool abandonner AVERTISSEMENT: la Connexion a été abandonné PooledConnection[com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception au org.apache.tomcat.jdbc.piscine.ConnectionPool.getThreadDump(ConnectionPool.java:967) au org.apache.tomcat.jdbc.piscine.ConnectionPool.borrowConnection(ConnectionPool.java:721) au org.apache.tomcat.jdbc.piscine.ConnectionPool.borrowConnection(ConnectionPool.java:579) au org.apache.tomcat.jdbc.piscine.ConnectionPool.getConnection(ConnectionPool.java:174) au org.apache.tomcat.jdbc.piscine.DataSourceProxy.getConnection(DataSourceProxy.java:111) au com.getsom.getConnection(DAO.java:1444) au com.getsom.PreparedConnection.(PreparedConnection.java:48) au com.getsom.Alarmes.exécuter(Alarmes.java:492)
Mon PoolProperties sont configurés comme suit:
PoolProperties pp = new PoolProperties();
pp.setUrl( someValidUrl);
pp.setDriverClassName("com.mysql.jdbc.Driver");
pp.setUsername( someUser);
pp.setPassword( somePassword);
pp.setJmxEnabled( true);
pp.setTestWhileIdle( true);
pp.setTestOnBorrow( true);
pp.setValidationQuery( "SELECT 1");
pp.setTestOnReturn( false);
pp.setValidationInterval(30000);
pp.setTimeBetweenEvictionRunsMillis(30000);
pp.setMaxActive(100);
pp.setInitialSize(10);
pp.setMaxWait(10000);
pp.setMinEvictableIdleTimeMillis(30000);
pp.setMinIdle(10);
pp.setLogAbandoned(true);
pp.setRemoveAbandoned(true);
pp.setRemoveAbandonedTimeout(60);
pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
setPoolProperties(pp);
J'espérais setValidationInterval(30000) me sauver, depuis des années 30 n'est pas beaucoup dans une connexion cycle de vie. De toute façon, la question est:
Ce qui me manque pour garder ce lien vivant pour toujours?
Un bon à savoir : Pourquoi suis-je timing dans la fonction qui a coûté la connexion, même si elle a été invoquée 30 secondes plus tôt.
OriginalL'auteur MonoThreaded | 2012-10-29
Vous devez vous connecter pour publier un commentaire.
Même si je suis à plus de 1 an de retard à l'entrée par cette page, mais je suis tombé ici, parce que je connaît des problèmes similaires et ont besoin d'une solution de trop. J'ai donc pensé que je devais partager ce qui est finalement fonctionné pour moi.
Dans mon cas, après la découverte et la lecture de cet article >>> configuration-jdbc-piscine-haute concurrence - j'ai juste ajouté un intercepteur de ce genre pour ma piscine de configuration;
de sorte que la ligne (à partir de votre affiché le code ci-dessus) où vous ne
setJdbcInterceptors(...)
devrait maintenant ressembler à celui-ci;Explication - citation de l'article, il est dit;
En gardant à l'esprit que vous avez plus de chances d'avoir surmonter le problème il y a longtemps, j'ai encore de l'espoir, cela aide quelqu'un d'autre ayant des problèmes similaires qui tombe sur cette page, comme je l'ai fait.
Cheers!
Cette réponse, c'est ma solution! Merci les gars!
OriginalL'auteur
Avez-vous vu les renseignements sur le site web Tomcat relatives à PoolConnection. Peut-être ce dont vous avez besoin est de regarder la propriété
minEvictableIdleTimeMillis
Pour répondre à votre question, vous êtes timing parce que vous êtes à la vérification d'inactivité & abandonner les connexions toutes les 30 secondes (voir
TimeBetweenEvictionRunsMillis
) et puisque vous êtes à la définition d'une evictable délai d'inactivité au bout de 30 secondes (voirminEvictableIdleTimeMillis
) puis vous vous retrouvez avec ce que vous avez. Vous avez dit que vous recevez cette exception lorsqu'il est inactif, je soupçonne que l'exception est la suite de la fermeture de la connexion inactive, par opposition à l'abandon d'une connexion. De ma compréhension de l'abandon d'une connexion est utilisé pour la synchronisation plus longtemps que prévu des requêtes (par opposition à des connexions inactives).Personnellement, je ne voudrais pas avoir de vie des connexions à jamais parce qu'ils consomment des ressources (c'est une connexion à la db) inutilement. Je voudrais jouer avec mon max de connexions, l'expulsion s'exécute et les moments d'inactivité pour optimiser pour mes propres besoins. Je suppose que vous pouvez définir ces valeurs assez grandes pour être presque toujours!!!! Il n'a vraiment dépendre de ce que vous faites...
Désolé je ne pouvais pas être plus d'aide ici.
Êtes-vous d'obtenir le message d'erreur lorsque vous exécutez une requête? Il semblerait étrange que vous avez une requête en cours d'exécution pendant plus de 60 secondes!
Nope. Le fil en question est inactif. Qui est le problème depuis ConnectionPool suppose que la connexion est abandonnée.
J'ai édité ma réponse cependant l'impression que je n'ai pas vraiment aidé beaucoup...
L'espoir est d'une valeur inestimable 🙂
OriginalL'auteur
juste ajouter dans tomcat7 dans le fichier conf/server.xml
OriginalL'auteur
piste "removeAbandonedTimeout' dans le fichier de configuration. ce maximum d'exécution d'une requête dans l'application. autrement, il va fermer la connexion dans le milieu de l'exécution
Pouvez-vous expliquer comment la "voie" que l'attribut de ressource dans Tomcat?
OriginalL'auteur
Si vous définissez votre source de données dans le context.xml de tomcat ensuite, vous devez ajouter le ResetAbandonedTimer comme ci-dessous :
Après la mise ResetAbandonedTimer, la question ai résolu dans mon application, vous Demandant de me le faire savoir est-il une relation entre ResetAbandonedTimer intercepteur et removeAbandoned="true" removeAbandonedTimeout="60"
OriginalL'auteur
Les réponses à cette question ont été très utiles pour moi.
Bien que dans mon cas, j'ai déjà eu l' "ResetAbandonedTimer" JDBC Intercepteur configuré.
Cependant, j'ai une requête qui a duré plus longtemps que la "removeAbandonedTimeout" que j'avais également configuré. Une fois que j'ai augmenté la "removeAbandonedTimeout" le problème a disparu.
OriginalL'auteur