Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SCHEINBARER DEADLOCK Erstellen von Notfall-Threads für nicht zugewiesene anstehende Aufgaben

Von http://www.mchange.com/projects/c3p0/#other_ds_configuration

AnzahlHelperThreads und maxAdministrativeTaskTime helfen, das Verhalten von DataSource-Thread-Pools zu konfigurieren. Standardmäßig hat jede DataSource nur drei zugeordnete Hilfsthreads. Wenn die Leistung unter starker Last zu sinken scheint oder wenn Sie über JMX oder die direkte Inspektion einer PooledDataSource feststellen, dass die Anzahl der „ausstehenden Aufgaben“ normalerweise größer als null ist, versuchen Sie, numHelperThreads zu erhöhen. maxAdministrativeTaskTime kann für Benutzer nützlich sein, bei denen Aufgaben auftreten, die auf unbestimmte Zeit hängen bleiben, und "SCHEINBARER DEADLOCK"-Meldungen. (Weitere Informationen finden Sie in Anhang A.)

maxAdministrativeTaskTime Standard:0Sekunden, bevor der Thread-Pool von c3p0 versucht, eine offensichtlich hängende Aufgabe zu unterbrechen. Selten nützlich. Viele Funktionen von c3p0 werden nicht von Client-Threads ausgeführt, sondern asynchron von einem internen Thread-Pool. Die Asynchronität von c3p0 verbessert die Clientleistung direkt und minimiert die Zeitdauer, in der kritische Sperren gehalten werden, indem sichergestellt wird, dass langsame jdbc-Operationen in Threads ausgeführt werden, die keine Sperren halten. Wenn jedoch einige dieser Tasks "hängen", d. h. weder erfolgreich sind noch über einen längeren Zeitraum mit einer Exception fehlschlagen, kann der Thread-Pool von c3p0 erschöpft und administrative Tasks blockiert werden. Wenn die Tasks einfach langsam sind, besteht der beste Weg zur Lösung des Problems darin, die Anzahl der Threads über numHelperThreads zu erhöhen . Wenn Aufgaben jedoch manchmal auf unbestimmte Zeit hängen bleiben, können Sie diesen Parameter verwenden, um einen Aufruf der interrupt()-Methode des Aufgaben-Threads zu erzwingen, wenn eine Aufgabe ein festgelegtes Zeitlimit überschreitet. [c3p0 wird sich irgendwann von hängenden Aufgaben erholen, indem es einen "SCHEINBAREN DEADLOCK" signalisiert (Sie werden es als Warnung in den Protokollen sehen), die Aufgaben-Threads des Thread-Pools ersetzen und die ursprünglichen Threads unterbrechen (). Aber wenn der Pool in APPARENT DEADLOCK geht und sich dann erholt, bedeutet dies, dass die Leistung von c3p0 für einige Zeiträume beeinträchtigt wird. Wenn Sie also diese Meldungen sehen, kann es hilfreich sein, numHelperThreads zu erhöhen und maxAdministrativeTaskTime einzustellen . maxAdministrativeTaskTime sollte groß genug sein, dass erwartet wird, dass jeder vernünftige Versuch, eine Verbindung aus der Datenbank zu beziehen, eine Verbindung zu testen oder eine Verbindung zu zerstören, innerhalb der festgelegten Zeit erfolgreich ist oder fehlschlägt. Null (Standardeinstellung) bedeutet, dass Aufgaben nie unterbrochen werden, was unter den meisten Umständen die beste und sicherste Richtlinie ist. Wenn Aufgaben nur langsam sind, weisen Sie mehr Threads zu. Wenn Aufgaben für immer hängen bleiben, versuchen Sie herauszufinden, warum, und vielleicht kann das Festlegen von maxAdministrativeTaskTime in der Zwischenzeit helfen.

The default is 3 for numHelperThreads , increase this to 8-10 

setting maxAdministrativeTaskTime will help