Nous utilisons hibernate avec mysql 5, nous avons un schéma de BD par profil d'utilisateurs et donc un PersistenceManagerFactory pour chacun paramétré comme ceci :
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.transaction.factory_class=org.hibernate.transaction.JDBCTransactionFactory
hibernate.show_sql=false
hibernate.c3p0.acquire_increment=1
hibernate.c3p0.idle_test_period=10 (valeur volontairement basse pour tester)
hibernate.c3p0.timeout=30 (valeur volontairement basse pour tester)
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=4
hibernate.c3p0.max_statements=50
le problème est le suivant : Le Pool de connexion semble saturer très vite alors que les sessions sont bien fermées à la fin de chaque requête HTTP,
L'appli se bloque sur cette instruction:
Object.wait(long) line: not available [native method]
BasicResourcePool.awaitAcquire(long) line: 968
BasicResourcePool.checkoutResource(long) line: 208
C3P0PooledConnectionPool.checkoutPooledConnection() line: 260
PoolBackedDataSource.getConnection() line: 94
C3P0ConnectionProvider.getConnection() line: 35
ConnectionManager.openConnection() line: 298
ConnectionManager.getConnection() line: 110
BatchingBatcher(AbstractBatcher).prepareQueryStatement(String, boolean, ScrollMode) line: 88
QueryLoader(Loader).prepareQueryStatement(QueryParameters, boolean, SessionImplementor) line: 1162
QueryLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 390
QueryLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean) line: 218
QueryLoader(Loader).doList(SessionImplementor, QueryParameters) line: 1593
QueryLoader(Loader).list(SessionImplementor, QueryParameters, Set, Type[]) line: 1577
QueryLoader.list(SessionImplementor, QueryParameters) line: 395
QueryTranslatorImpl.list(SessionImplementor, QueryParameters) line: 271
SessionImpl.list(String, QueryParameters) line: 844
QueryImpl.list() line: 74
QueryImpl(AbstractQueryImpl).uniqueResult() line: 603
en regardant bien tous les threads de mon appli qui tournent, je viens de remarquer qque chose d'étrange, j'ai 3 threads bloqués là dessus :
Object.wait(long) line: not available [native method]
ChangeNotifyingSynchronizedIntHolder(Object).wait() line: 474
GlobalMaxOnlyStatementCache(GooGooStatementCache).closeAll(Connection) line: 256
NewPooledConnection.closeAllCachedStatements() line: 532
NewPooledConnection.close(Throwable) line: 411
NewPooledConnection.close() line: 143
C3P0PooledConnectionPool$1.destroyResource(Object) line: 236
BasicResourcePool$5.run() line: 634
ThreadPoolAsynchronousRunner$PoolThread.run() line: 368
du coup je comprend mieux pourquoi ma 4è demande de connection plante mais pourquoi les 3 threads sont bloqués? pb d'interbocage??
merci pour votre aide...
|