Impasse de la question dans le DBCP déployé sur Tomcat
Je suis en utilisant le DBCP source de données (configuration par défaut), au Printemps de configuration pour gérer mes connexions à la base de données, et je suis en cours d'exécution dans une situation de blocage lorsque le nombre de clients augmenter.
J'ai trouvé qu'il y a un problème de blocage dans le DBCP 1.2.1 qui j'ai été en utilisant, ce qui était censé être résolu dans la version 1.4. J'ai donc mis à niveau vers la version 1.4, mais le problème persiste.
Dans le thread dump, il y a beaucoup de threads bloqués à la suite de trace de la pile sur le dessus:
java.lang.Thread.State: WAITING on org.apache.commons.pool.impl.GenericObjectPool$Latch@b6b09e
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:200)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:261)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631)
Toutes les suggestions sont les bienvenues!
- Je suis confronté à un problème similaire.. avez-vous résoudre ce problème.. pourriez-vous nous donner quelques pointeur si si..
- Je suis passé à c3p0 trop, a été très heureux avec les fonctionnalités et la stabilité. Je n'ai pas utilisé DBCP depuis, donc je ne peux pas dire si le problème existe encore ou non.
Vous devez vous connecter pour publier un commentaire.
Je suis passé à c3p0, quelques années en arrière. Vous pouvez essayer. Je crois que vous n'avez pas besoin de changer, c'est juste un jeu de configuration.
Quelque peu le sujet, Options de groupement de connexions avec JDBC: DBCP vs C3P0. Eh bien, en fait je l'ai fait liées.
[édité, 19/10/12]
Tomcat 7 dispose d'une connexion décente piscine, Le Tomcat Pool de connexions JDBC.
Avez-vous assurez-vous que la chambre des communes-piscine de version correspond à la dbcp version?
Aussi, je ne vois pas un blocage dans le stacktrace, il ressemble simplement vous avez des threads en attente de connexions pour libérer.. Combien de threads avez-vous essayer de se connecter en même temps? Combien de connexions avez-vous configuré pour la piscine, etc..?
De débogage dans ce genre de cas, il est également utile de regarder ce que les discussions qui ont eu une connexion sont en train de faire.
Incrasing charge de l'application est de plus en plus besoin de connexions simultanées. Que vos fils sont accrochés sur
borrowConnection()
- signifie que vous êtes de ne pas avoir suffisamment deActiveConnections
disponibles.Incrkease
maxActive
dans votre source de données des propriétés et définir lesWHEN_EXHAUSTED_BLOCK
pour un certain temps comme600ms - 1000ms
. Vous obtiendrezNo element available
exception seulement après avoir écoulé de 600ms -1000 mme.Je pense que c'est dû à la non fermeture des connexions dans votre code d'application, donc vous avez juste à court de connexions dans le pool.
Peut-être que vous devriez essayer de définir le "removeAbandoned" propriété dans DBCP.
Ceci est documenté dans http://commons.apache.org/dbcp/configuration.html comme
Bonne chance!
J'ai été confronté à des problèmes similaires et cela a été résolu en suivant les étapes
Fermer toutes les ressources de base de données dans le bon ordre
Pilotes différents sont mis en œuvre différemment, certains pilotes serait encore la main sur la connexion si le jeu de résultats n'est pas fermé.
dataSource.setDefaultAutoCommit(true);
dataSource.setMaxActive(700); //make sure db server has it 800
dataSource.setRemoveAbandoned(true);
dataSource.setTestOnBorrow(true);
dataSource.setLogAbandoned(true);
dataSource.setTestWhileIdle(true);
dataSource.setTestOnReturn(true);
dataSource.setRemoveAbandonedTimeout(60);
Assurez-vous que serveur de base de données peut permettre à au moins 50+ connecitions plus que le nombre spécifié dans
setMaxActive
que le dbcp donnex
de nouvelles connexions d'abord, puis essayez de nettoyer les connexions dépassantsetMaxActive
nombre. Sur le nettoyage dbcp montre toutes les connexions n'ont pas été fermés sur le serveur log/console.