2016-07-21 25 views
0

Ich habe ein Problem mit C3P0 APPARENT DEAD. Ich habe viele andere verwandte Fragen hier angeschaut, aber ich konnte das Problem nicht lösen. Wenn jemand eine mögliche Lösung vorschlagen kann, wäre es dankbar!Scheinbarer Deadlock c3p0 Problem

c3p0 Version: c3p0-0.9.5.2

c3p0 XML-Konfigurationsdatei

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="jdbcUrl" 
     value="jdbc:oracle:thin:@transport-crash-ora-tst.cee.wisc.edu:1521:DTCRDBT" /> 
    <property name="user" value="transdev" /> 
    <property name="password" value="Its2$123" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="maxStatements" value="0" /> 
    <property name="minPoolSize" value="5" /> 
    <property name="statementCacheNumDeferredCloseThreads" value="1"></property> 
</bean> 

Nachrichten in der Konsolenansicht

[localhost-startStop-1] INFO com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10] 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. 
[localhost-startStop-1] INFO com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 72r5me9i3xucoj6ds3mi|10319844, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.driver.OracleDriver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 72r5me9i3xucoj6ds3mi|10319844, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:oracle:thin:@transport-crash-ora-tst.cee.wisc.edu:1521:DTCRDBT, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 1, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] 
[localhost-startStop-1] WARN com.mchange.v2.resourcepool.BasicResourcePool - Bad pool size config, start 3 < min 5. Using 5 as start. 
[C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-AdminTaskTimer] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com[email protected]7bd1346f -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
[C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-AdminTaskTimer] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com[email protected]7bd1346f -- APPARENT DEADLOCK!!! Complete Status: 
Managed Threads: 3 
Active Threads: 3 
Active Tasks: 
    com[email protected]342bcf5e 
     on thread: C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#2 
    com[email protected]46abe7f8 
     on thread: C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#1 
    com[email protected]5d53fa5 
     on thread: C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#0 
Pending Tasks: 
    com[email protected]3ebf49a7 
    com[email protected]54043011 
Pool thread stack traces: 
Thread[C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#2,5,main] 
    java.net.PlainSocketImpl.socketConnect(Native Method) 
    java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    java.net.Socket.connect(Socket.java:589) 
    oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:162) 
    oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411) 
    oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464) 
    oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594) 
    oracle.net.ns.NSProtocol.connect(NSProtocol.java:229) 
    oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) 
    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) 
    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715) 
    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) 
    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) 
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564) 
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) 
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) 
    com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) 
    com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) 
Thread[C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#0,5,main] 
    java.net.PlainSocketImpl.socketConnect(Native Method) 
    java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    java.net.Socket.connect(Socket.java:589) 
    oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:162) 
    oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411) 
    oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464) 
    oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594) 
    oracle.net.ns.NSProtocol.connect(NSProtocol.java:229) 
    oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) 
    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) 
    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715) 
    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) 
    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) 
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564) 
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) 
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) 
    com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) 
    com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) 
Thread[C3P0PooledConnectionPoolManager[identityToken->72r5me9i3xucoj6ds3mi|10319844]-HelperThread-#1,5,main] 
    java.net.PlainSocketImpl.socketConnect(Native Method) 
    java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    java.net.Socket.connect(Socket.java:589) 
    oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:162) 
    oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411) 
    oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464) 
    oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594) 
    oracle.net.ns.NSProtocol.connect(NSProtocol.java:229) 
    oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) 
    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) 
    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715) 
    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) 
    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) 
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564) 
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220) 
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206) 
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138) 
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125) 
    com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44) 
    com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696) 

Antwort

0

Threads, die versuchen, Verbindungen zu erwerben von Ihrem DBMS sind weder erfolgreich, noch scheitern mit einer Ausnahme. Sie frieren einfach. Das ist das Problem, das Sie debuggen müssen. Es kann eine Art Netzwerk/Firewall-ähnliches Problem sein. Wenn Sie beispielsweise über AWS versuchen, eine Verbindung zu einer Maschine oder einem Dienst ohne Konfiguration einer Sicherheitsgruppe herzustellen, um die Verbindung zuzulassen, führt dies häufig zu solchen Verzögerungen.

Als erstes müssen Sie sicherstellen, dass Sie mit DriverManager.getConnection() eine Verbindung herstellen können, wo auch immer Ihre App lebt.

(Wenn Sie möchten, können Sie vorübergehend "com.mchange.v2.c3p0.ComboPooledDataSource" in "com.mchange.v2.c3p0.DriverManagerDataSource" in Ihrem Bean XML ändern und sehen, ob die Dinge "funktionieren" Leistung wird schlecht sein, da DriverManagerDataSource kein Pooling, aber Sie können sehen, ob alle oder einige Client Threads hängen bleiben, wenn Sie versuchen, Verbindungen zu erwerben.)

Wenn Ihre App normalerweise Verbindungen erwerben kann, aber gelegentlich so hängen und Sie sind nicht in der Lage, den Hang zu lösen, können Sie versuchen, es mit zwei c3p0 Config-Eigenschaften umgehen:

maxAdministrativeTaskTime können Sie eine Zeitüberschreitung festlegen, nach der c3p0 Thread-Pool versuchen wird Interrupt() eingefroren Aufgaben

numHelperThreads können Sie die Anzahl der Threads erhöhen, die durch den Einfrieren gefangen werden müssen, bevor Sie beginnen, APPARENT DEADLOCK Nachrichten zu sehen.