2017-01-27 15 views
0

Я новичок в hibernate и начал использовать C3P0 в качестве менеджера пула соединений с hibernate, потому что без этого у меня были проблемы с таймаутом после 8 часов отсутствия контакта с сервером MySQL.c3p0 deadlocks в Hibernate

После перехода на C3P0 я недавно столкнулся с тупиком, и я не уверен, как это произошло. У меня есть все трассировки стека и конфигурация.

Вот журнал конфигурации

Jan 27, 2017 5:56:23 PM com.mchange.v2.log.MLog <clinit> 
INFO: MLog clients using java 1.4+ standard logging. 
Jan 27, 2017 5:56:23 PM com.mchange.v2.c3p0.C3P0Registry banner 
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10] 
Jan 27, 2017 5:56:23 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager 
INFO: Initializing c3p0 pool... [email protected] [ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge14z9l1qg67m9nxywg8|c2db68f, idleConnectionTestPeriod -> 300, initialPoolSize -> 1, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 120, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 25, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 1, nestedDataSource -> com.mchange.v2.c3p0.[email protected] [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge14z9l1qg67m9nxywg8|1b765a2c, jdbcUrl -> jdbc:mysql://localhost/Pokemon_Blaze_Online_Dev, properties -> {user=******, password=******} ], preferredTestQuery -> select 1;, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge14z9l1qg67m9nxywg8|7e276594, numHelperThreads -> 3 ] 

Здесь свойства я установить

<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">300</property> 
<property name="hibernate.c3p0.timeout">120</property> 
<property name="hibernate.c3p0.max_size">25</property> 
<property name="hibernate.c3p0.min_size">1</property> 
<property name="hibernate.c3p0.max_statement">0</property> 
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property> 
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

Здесь вы нить дамп одного из нити, заперли.

"Request Pool-0" #71 prio=5 os_prio=0 tid=0x000000002b2df800 nid=0x1d48 in Object.wait() [0x000000003113e000] 
    java.lang.Thread.State: WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1414) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606) 
    - locked <0x00000006c1b3c088> (a com.mchange.v2.resourcepool.BasicResourcePool) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:682) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) 
    at org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:90) 
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:387) 
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) 
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:63) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186) 
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1884) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1861) 
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:909) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) 
    at org.hibernate.loader.Loader.doList(Loader.java:2553) 
    at org.hibernate.loader.Loader.doList(Loader.java:2539) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) 
    at org.hibernate.loader.Loader.list(Loader.java:2364) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682) 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) 
    at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402) 
    at com.game.server.persistence.services.player.PlayerDataServiceImpl.areValidCredentials(PlayerDataServiceImpl.java:28) 
    at com.game.server.manager.request.service.DefaultLoginService.login(DefaultLoginService.java:78) 
    at com.game.server.manager.request.DefaultRequestManager.lambda$login$2(DefaultRequestManager.java:103) 
    at com.game.server.manager.request.DefaultRequestManager$$Lambda$63/869031346.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

    Locked ownable synchronizers: 
    - <0x000000079eea0890> (a java.util.concurrent.ThreadPoolExecutor$Worker) 

Поскольку я немного новичок в этом, я не мог идентифицировать проблему из журнала и из дампа. Я также заметил, что C3P0 создал много потоков.

enter image description here

ответ

2

Ваше приложение почти наверняка просачивается Connections. См. c3p0's docs о том, как отладить проблему.

TL; DR: Set

<property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property> 
<property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property> 

Проверьте журналы для трассировки стека, которые проверяют из соединений или сеансов в вашем приложении, но не в состоянии надежно закрыть() их. Исправьте это, используя что-то вроде try-with-resources, чтобы надежно закрыть вещи. После устранения проблемы удалите указанные выше свойства.

Смотрите также this

+0

Да, я действительно не закрывая сессию в одном из моего метода. Я не пробовал c3p0 с тех пор, но я уверен, что это исправит проблему. – Sneh

+0

Это действительно исправлено: – Sneh