c3p0 getConnection() throws exception: Un ResourcePool ne pourrait pas acquérir une ressource à partir de sa principale usine ou de la source
nous avons un [Hibernate + c3p0 + MySQL] config pour notre projet. Nous sommes frapper l'exception suivante:
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ~[c3p0-0.9.1.2.jar:0.9.1.2]
Wrapped by: java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) ~[c3p0-0.9.1.2.jar:0.9.1.2]
at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:276) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
Wrapped by: org.hibernate.exception.GenericJDBCException: Could not open connection
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:52) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1263) ~[hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:399) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE]
Wrapped by: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:440) ~[spring-orm-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:336) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at $Proxy28.messageExists(Unknown Source) ~[na:na]
Notre c3p0 config:
<bean id="provDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
…
<property name="acquireIncrement" value="1" />
<property name="idleConnectionTestPeriod" value="100"/>
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="50" />
<property name="maxIdleTime" value="1800" />
</bean>
Noter que nous avons aussi un autre semblable, c3p0 source de données configuré sur le dessus de cette instance MySQL.
Quelqu'un peut-il me donner quelques suggestions sur la façon de déboguer?
quel est l'autre source de données?
Même config avec un id différent.
Avez-vous tenté d'augmenter la limite de connexion sur la base de données?
Aussi est-ce possible sur le démarrage ou après un certain temps, au moment de l'exécution? Êtes-vous sûr que vous avez configuré vos paramètres de base de données correctement?
C'est au cours de l'exécution. Je doute qu'elle était liée à la limite de connexion pour la db. Le moniteur affiche la DB nombre de connexions avec un motif en dents de scie (en.wikipedia.org/wiki/Sawtooth_wave), ce qui est vraiment bizarre. La DB est arriver de n'importe où entre 40-300 connexions. Nous avons ds1 avec maxPoolSize=300 et ds2 avec maxPoolSize=50.
Même config avec un id différent.
Avez-vous tenté d'augmenter la limite de connexion sur la base de données?
Aussi est-ce possible sur le démarrage ou après un certain temps, au moment de l'exécution? Êtes-vous sûr que vous avez configuré vos paramètres de base de données correctement?
C'est au cours de l'exécution. Je doute qu'elle était liée à la limite de connexion pour la db. Le moniteur affiche la DB nombre de connexions avec un motif en dents de scie (en.wikipedia.org/wiki/Sawtooth_wave), ce qui est vraiment bizarre. La DB est arriver de n'importe où entre 40-300 connexions. Nous avons ds1 avec maxPoolSize=300 et ds2 avec maxPoolSize=50.
OriginalL'auteur scabbage | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
Bien que n'étant pas strictement répondre à votre question, je ne voulais pas ajouter du code dans les commentaires du code dans les commentaires est illisible.
Voici un exemple de config de MySQL avec C3P0 de mon projet. remarque: tous les paramètres supplémentaires pour s'assurer que les connexions ne meurent pas. (À la fin je suis allé avec Postgres, car il n'a pas tuer mes connexions et a été plus stable en général, ayant également de tester à nouveau les connexions avec une sélection de 1; n'est pas très efficace)
OriginalL'auteur Brian