2017-04-26 1 views
0

J'ai une application java déployée sur tomcat version 7. Pour la source de données j'ai utilisé c3p0 qui se connecte à une base de données mysql. Cela fonctionnait bien depuis des années et récemment j'ai commencé à avoir cette erreur: "Un client a expiré en attendant d'acquérir une ressource de com.mchange.v2.resourcepool.BasicResourcePool".c3p0 Un client a expiré en attendant d'acquérir une ressource de com.mchange.v2.resourcepool.BasicResourcePool

Lorsque j'ai ce problème, la seule solution est de redémarrer l'application. Redémarrer mysql n'aide pas.

J'ai aussi des applications php en utilisant la base de données de sauvegarde et ils ne sont pas affectés, ils fonctionnent correctement.

L'application java est utilisée uniquement par une petite équipe, c'est une application backend.

Voici ma configuration c3p0:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&amp;autoReconnect=true&amp;autoReconnectForPools=true" /> 
    <property name="user" value="viva4578" /> 
    <property name="password" value="amd139fbg" /> 
    <property name="initialPoolSize" value="5" /> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="20" /> 
    <property name="maxConnectionAge" value="14400" /> 
    <property name="checkoutTimeout" value="30000" /> 
    <property name="acquireIncrement" value="1" /> 
    <property name="acquireRetryAttempts" value="30" /> 
    <property name="testConnectionOnCheckin" value="true" /> 
    <property name="testConnectionOnCheckout" value="true" /> 
    <property name="preferredTestQuery" value="SELECT 1" /> 
    <property name="idleConnectionTestPeriod" value="3600" /> 
    <property name="maxIdleTime" value="7200" /> 
    <property name="maxIdleTimeExcessConnections" value="1800" /> 
    <property name="unreturnedConnectionTimeout" value="3600" /> 
    <property name="debugUnreturnedConnectionStackTraces" value="true" /> 
</bean> 

Voici le journal de sortie de c3p0 après le démarrage de l'application:

Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ 
    acquireIncrement -> 1, 
    acquireRetryAttempts -> 30, 
    acquireRetryDelay -> 1000, 
    autoCommitOnClose -> false, 
    userOverrides -> {}, 
    automaticTestTable -> null, 
    breakAfterAcquireFailure -> false, 
    checkoutTimeout -> 30000, 
    connectionCustomizerClassName -> null, 
    connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, 
    contextClassLoaderSource -> caller, 
    dataSourceName -> z8kflt9n1b12nsh118544e|7bc1a68b, 
    debugUnreturnedConnectionStackTraces -> true, 
    description -> null, 
    driverClass -> com.mysql.jdbc.Driver, 
    extensions -> {}, 
    factoryClassLocation -> null, 
    forceIgnoreUnresolvedTransactions -> false, 
    forceUseNamedDriverClass -> false, 
    identityToken -> z8kflt9n1b12nsh118544e|7bc1a68b, 
    idleConnectionTestPeriod -> 3600, 
    initialPoolSize -> 5, 
    jdbcUrl -> jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&autoReconnect=true&autoReconnectForPools=true, 
    maxAdministrativeTaskTime -> 0, 
    maxConnectionAge -> 14400, 
    maxIdleTime -> 7200, 
    maxIdleTimeExcessConnections -> 1800, 
    maxPoolSize -> 20, 
    maxStatements -> 0, 
    maxStatementsPerConnection -> 0, 
    minPoolSize -> 5, 
    numHelperThreads -> 3, 
    preferredTestQuery -> SELECT 1, 
    privilegeSpawnedThreads -> false, 
    properties -> {user=******, password=******}, 
    propertyCycle -> 0, 
    statementCacheNumDeferredCloseThreads -> 0, 
    testConnectionOnCheckin -> true, 
    testConnectionOnCheckout -> true, 
    unreturnedConnectionTimeout -> 3600, 
    usesTraditionalReflectiveProxies -> false 
] 

J'utilise la 0-0.9.5 version de C3P0.

Si quelqu'un peut aider

Merci

Répondre

0

Ici

<property name="checkoutTimeout" value="30000" /> 

Vous avez configuré c3p0 pour lancer cette exception si un client ne peut pas être servi dans les 30 secondes. Cela a commencé à se produire. Vraisemblablement, la charge sur le DataSource a augmenté. Envisagez de l'augmenter. Augmentez la taille de maxPoolSize et augmentez également numHelperThreads si le problème concerne les tâches asynchrones. Vous pouvez également augmenter la valeur de checkoutTimeout, ou supprimer le paramètre, de sorte que les vérifications client ne soient jamais interrompues, ce qui éliminerait cette exception, mais pas vraiment le problème 30 secondes sont longues à attendre une connexion Il est probablement préférable de régler c3p0 pour fournir des connexions beaucoup plus rapidement que cela.)

+0

OK merci pour votre contribution. A mon avis 30 secondes c'est beaucoup sauf s'il y a une requête lente. – kchetoua

+0

J'ai changé la config log4j et maintenant je vois cette exception – kchetoua

+0

Une ressource extraite est en retard, et sera détruite: com.mchange.v2.c3p0.impl.NewPooledConnection Peut-être que c'est la cause du problème? – kchetoua