web-dev-qa-db-ger.com

C3P0 scheinbarer Deadlock, wenn alle Threads leer sind?

Ich verwende C3P0 als Verbindungspool in Tomcat und sehe sehr besorgniserregende Fehler:

2010-09-16 13:25:00,160 [Timer-0] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner  - com[email protected]43502400 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2010-09-16 13:25:01,407 [Timer-0] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner  - com[email protected]43502400 -- APPARENT DEADLOCK!!! Complete Status:
  Managed Threads: 10
  Active Threads: 0
  Active Tasks:
  Pending Tasks:
    com.mchange.[email protected]6e4151a7
  Pool thread stack traces:
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main]
    Java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
    Java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
    Java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
    Java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main]
    Java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main]
    Java.lang.Object.wait(Native Method)

... many more, exact same stack trace

Zeile 534 ist:

 while (true) {
   Runnable myTask;
   synchronized ( ThreadPoolAsynchronousRunner.this ) {
     while ( !should_stop && pendingTasks.size() == 0 )
       ThreadPoolAsynchronousRunner.this.wait( POLL_FOR_STOP_INTERVAL ); // <- here
     if (should_stop) ...

Es sieht so aus, als ob alle Threads im Leerlauf sind. Sie warten auf Arbeit. 0 aktive Threads und nur eine Aufgabe, die abgeschlossen werden muss. Irgendwelche Hinweise auf das, was falsch läuft?

Hier ist die Konfiguration:

ds.setUser(userName);
ds.setPassword(password);
ds.setMaxPoolSize(16);
ds.setMaxConnectionAge(1800);
ds.setAcquireRetryAttempts(4);
ds.setMaxIdleTime(900);
ds.setNumHelperThreads(10);
ds.setCheckoutTimeout(1000);
27

Ich habe gerade ein ähnliches Problem mit einer Oracle-Datenbank festgestellt, aber in meinem Fall waren Managed Thread und Active Thread die gleichen Werte.

    Managed Threads: 3
    Active Threads: 3

Für mich war es tatsächlich ein Authentifizierungsfehler, der jedoch als APPARENT DEADLOCK-Fehler angezeigt wurde, da ich die Login-Überwachung durchgeführt habe. 

    2013-08-12 11:29:04,910 [Timer-4] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner: com[email protected]34996454 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
    2013-08-12 11:29:04,914 [Timer-4] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner: com[email protected]34996454 -- APPARENT DEADLOCK!!! Complete Status: 
            Managed Threads: 3
            Active Threads: 3
            Active Tasks: 
                    [email protected]44 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
                    [email protected]49 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
                    [email protected]5 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
            Pending Tasks: 
                    [email protected]d7
    Pool thread stack traces:
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
                    Java.net.SocketInputStream.socketRead0(Native Method)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:150)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:121)
                    Oracle.net.ns.Packet.receive(Packet.Java:300)
                    Oracle.net.ns.DataPacket.receive(DataPacket.Java:106)
                    Oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.Java:315)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:260)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:185)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:102)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.Java:124)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.Java:80)
                    Oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.Java:1137)
                    Oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.Java:290)
                    Oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.Java:192)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:380)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:760)
                    Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:401)
                    Oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.Java:546)
                    Oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.Java:236)
                    Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:32)
                    Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:521)
                    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.Java:134)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:182)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:171)
                    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.Java:137)
                    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.Java:1014)
                    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.Java:32)
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1810)
                    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
                    Java.net.SocketInputStream.socketRead0(Native Method)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:150)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:121)
                    Oracle.net.ns.Packet.receive(Packet.Java:300)
                    Oracle.net.ns.DataPacket.receive(DataPacket.Java:106)
                    Oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.Java:315)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:260)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:185)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:102)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.Java:124)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.Java:80)
                    Oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.Java:1137)
                    Oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.Java:290)
                    Oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.Java:192)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:380)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:760)
                    Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:401)
                    Oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.Java:546)
                    Oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.Java:236)
                    Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:32)
                    Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:521)
                    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.Java:134)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:182)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:171)
                    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.Java:137)
                    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.Java:1014)
                    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.Java:32)
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1810)
                    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
                    Java.net.SocketInputStream.socketRead0(Native Method)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:150)
                    Java.net.SocketInputStream.read(SocketInputStream.Java:121)
                    Oracle.net.ns.Packet.receive(Packet.Java:300)
                    Oracle.net.ns.DataPacket.receive(DataPacket.Java:106)
                    Oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.Java:315)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:260)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:185)
                    Oracle.net.ns.NetInputStream.read(NetInputStream.Java:102)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.Java:124)
                    Oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.Java:80)
                    Oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.Java:1137)
                    Oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.Java:290)
                    Oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.Java:192)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:380)
                    Oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.Java:760)
                    Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:401)
                    Oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.Java:546)
                    Oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.Java:236)
                    Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:32)
                    Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:521)
                    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.Java:134)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:182)
                    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.Java:171)
                    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.Java:137)
                    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.Java:1014)
                    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.Java:32)
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.Java:1810)
                    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.Java:547)
13
eebbesen

Das klingt so, als hätten Sie bereits eine Verbindung aus dem Pool erworben und geben diese nicht rechtzeitig zurück.

C3P0 bestimmt "scheinbare Deadlocks", wenn eine Verbindung erworben, jedoch nicht innerhalb des Timeout-Deadlock-Erkennungszeitraums in den Pool zurückgegeben wird.

Wenn Sie die Verbindungsaufnahme näher an die "Aktion" verschieben und nach Abschluss der Datenbankarbeit sofort wieder in den Pool zurückkehren, wird diese Meldung ausgeblendet.

7
Thomas Weber

Dies wird Ihr Problem lösen

ds.setMaxStatements(1000);
ds.setMaxStatementsPerConnection(100); (the maximum number of prepared statments your system can execute on a single connection)

check out: https://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0

Denken Sie daran, Ihre Aussagen zu schließen, nachdem Sie damit fertig sind !!

4
ChristiaanP

Hallo mein Freund, nur um zu kommentieren, ich hatte den gleichen Fall. Ich habe gerade mein Eclipse-Projekt für den Frühling-Winterschlaf konfiguriert und die gleiche Ausnahme gezeigt. Es ist zu beachten, dass mein Projekt immer noch keine Abfrage hat.

Ich habe dieses Problem mit den folgenden Schritten behoben:

1) Projekt bereinigen: Projekt -> Bereinigen ... 2) Projekt erstellen: Projekt -> Projekt erstellen

Ich hoffe es klappt bei dir. 

Ich hatte das gleiche Problem (konnte nicht feststellen), das durch das korrekte Schließen von Statement- und Resultset-Instanzen (irgendwie nicht geschlossen) behoben wurde:

String SQL = "SELECT 1";
try {
    con = DriverManager.getConnection(Host, userName, userPassword);
    stmt = con.prepareStatement(SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    try {
        rs = stmt.executeQuery(SQL);
        try {
            rs.next();
            // ...
        } finally {
            rs.close();
        }
    } finally {
        stmt.close();
    }
} catch (SQLException ex) {
    Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
}
0
Zon

Ich hatte das gleiche Problem, aber die Ursache war etwas schwer zu erkennen, da einige Ressourcen gleichzeitig versucht haben, gleichzeitig eine Verbindung herzustellen.

Wie Sie lesen können, wenn der Pool nicht initialisiert wurde, wurde der Code bereitgestellt, um ihn durch Aufrufen einer Setup-Funktion zu initiieren.

public Connection getConnection() throws SQLException {
    if (mCPDS == null) {
        setupPool();
    }

    return mCPDS.getConnection();
}

Das Problem bestand darin, dass viele Ressourcen zu Beginn des Programms versucht haben, die Verbindung zu erhalten, sodass mehr als eine Instanz den Pool instanziierte, was nach einiger Zeit zu Ihrem Problem führte.

Die Lösung bestand nur darin, die Methode als synchronisiert zu deklarieren, um andere Ressourcen auszuschließen, während die Methode aufgerufen wurde und sie sich noch in der Instanz befindet, um beispielsweise den Pool zu instanziieren.

public synchronized Connection getConnection() throws SQLException {
    if (mCPDS == null) {
        setupPool();
    }

    return mCPDS.getConnection();
}

Dies kann ein Entwurfsfehler sein, wenn kein Singleton verwendet wird, behebt jedoch das Problem ohne Leistung.

0
atzu

Ich hatte plötzlich dasselbe Problem: Nachdem ich festgestellt hatte, dass der Deadlock nur beim Starten meiner Anwendung im Debug-Modus (ich verwende IntelliJ) vorhanden war, und als es normal lief, begann ich mit Dig zu arbeiten.

Ich fand schließlich heraus, dass ein Haltepunkt die Verbindung blockierte: Ich weiß nicht, warum Intellij nicht "zugehört" hat, dass die Anwendung diesen Haltepunkt durchlaufen hat, sondern irgendwo wegen eines Haltepunkts aufgehängt wurde und dies appartent verursachte Sackgasse

Nachdem ich alle Haltepunkte in meinem Projekt entfernt hatte, ging alles wieder reibungslos vonstatten.

Hoffe das hilft jemandem

0
Leviand

@ eebbesen, ich habe den gleichen Fehler wie du. Ich verwende Tomcat Version 9.0.6. Ich habe in meinem Maven-Projekt den Kern der Version 5.2.10, den Winterschlaf c3p0 in der Version 3.6.3. Bei mir handelte es sich nicht um einen Authentifizierungsfehler, sondern darum, dass ich zuvor meinen Computernamen geändert hatte. Dies hatte keine unmittelbaren Auswirkungen auf Tomcat, aber bei einem Neustart meiner Maschine, als ich versuchte, Tomcat erneut über Eclipse (Oxygen 2) aufzurufen, konnte ich Eclipse aufgrund des von Ihnen aufgeworfenen Problems nicht mehr starten.

Ich habe gegoogelt und diesen Link gefunden, der mich zum Thema brachte:

https://community.Oracle.com/thread/339825

wo steht:

Stellen Sie zunächst fest, ob OracleServiceXE- und OracleXETNSListener-Dienste .__ sind. Laufen. Ersetzen Sie in der URL 127.0.0.1 durch die IP oder den Namen Ihres Maschine. Sie muss mit dem in der Datei tnsnames.ora deklarierten Host übereinstimmen.

Später wird erwähnt, wo diese Datei tnsnames.ora zu finden ist, und für mich war es hier:

C:\oraclexe\app\Oracle\product\11.2.0\server\network\ADMIN

Beim Betrachten dieser Datei tnsnames.ora sah ich Folgendes:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = MyMachineName-7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Ich hatte meinen Computer jedoch vor kurzem in MyMachineName-5 umbenannt. Ich habe die 7 in eine 5 geändert und die Datei gespeichert. Ich habe die Datei "listener.ora" in diesem Verzeichnis geprüft und hatte das gleiche Problem:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(Host = MyMachineName-7)(PORT = 1521))
    )
  )

Ich habe die 7 in eine 5 geändert und die Datei gespeichert.

Dann habe ich den Task-Manager geöffnet, auf die Registerkarte "Dienste" geklickt und die "Oracle" -Dienste angesehen. Ich habe einen Neustart von OracleXETNSListener, OracleXEClrAgent und OracleServiceXE durchgeführt. Ich habe Tomcat in Eclipse erneut gestartet, und dieses Mal gab es jetzt ein Problem.

Blinddarm:

Ich habe auch gegoogelt: 

https://community.Oracle.com/thread/2267906

Dies führte mich zu versuchen:

1) Firewall in Windows Defender deaktiviert (mcaffee firewall bereits deaktiviert)

2) Starten von sqlplus, um sicherzustellen, dass ich mich mit den Anmeldeinformationen anmelden kann, die ich in meiner Hibernate-Datei verwendet habe: hibernate.cfg.xml

C:\oraclexe\app\Oracle\product\11.2.0\server\bin\sqlplus.exe

3) Die Desktopverknüpfung zu Oracle Database 11g wurde gestartet

Dies schlug für mich fehl, auch nachdem ich das Problem mit dem Maschinennamen behoben hatte, etwas, das ich noch prüfen muss.

4) Ich habe versucht, mit dbVisualizer eine Verbindung zu Oracle herzustellen. Dies funktionierte nur, nachdem das Problem mit dem Namen der .ora-Datei behoben wurde: Doppelklicken Sie auf die Verbindung und klicken Sie auf die Schaltfläche "Ping-Server".

0
Steve T

Mein Kommentar zur Antwort https://stackoverflow.com/a/18192588/1019307 erhielt genügend Stimmen, um darauf hinzuweisen, dass dies eine Antwort sein sollte.

Ich habe diese Fehlermeldung erhalten, weil ich nicht durch die Firewall zum Datenbankserver gelangen konnte. Prüfen Sie, ob dies Ihr Problem ist.

0
HankCa