Lassen Sie uns zuerst die mysql-Eigenschaften verstehen.
interactive_timeout
:Interaktives Timeout für MySQL-Shell-Sitzungen in Sekunden wie mysqldump oder mysql-Befehlszeilentools. Verbindungen befinden sich im Ruhezustand. Meistens ist dies auf einen höheren Wert eingestellt, weil Sie nicht wollen, dass die Verbindung getrennt wird, während Sie etwas auf mysql cli tun.wait_timeout
:die Anzahl von Sekunden während der Inaktivität, die MySQL wartet, bevor es eine Verbindung auf einer nicht-interaktiven Verbindung in Sekunden schließt. Beispiel:Verbunden von Java. Verbindungen befinden sich im Ruhezustand.
Lassen Sie uns nun die c3po-Eigenschaften und ihre Beziehung zu DB-Requisiten verstehen. (Ich werde nur von Ihrer Frage kopieren)
Dies bezieht sich darauf, wie lange ein Verbindungsobjekt verwendet werden kann und im Pool verfügbar sein wird. Sobald das Timeout abgelaufen ist, wird c3po es zerstören oder recyceln.
Jetzt kommt das Problem, wenn Sie maxIdleTime
haben höher als wait_timeout
.sagen wir, wenn mxIdleTime : 50
Sekunden und wait_timeout : 40 s
dann besteht die Möglichkeit, dass Sie Connection time out exception: Broken Pipe
erhalten wenn Sie versuchen, in den letzten 10 Sekunden eine Operation auszuführen. Also maxIdelTime
sollte immer kleiner als wait_timeout
sein .
Anstelle von maxIdleTime können Sie die folgenden Eigenschaften verwenden.
idleConnectionTestPeriod
legt ein Limit fest, wie lange eine Verbindung im Leerlauf bleibt, bevor sie getestet wird. OhnepreferredTestQuery
, der Standardwert istDatabaseMetaData.getTables()
- Das ist Datenbank-agnostisch, und obwohl es ein relativ teurer Aufruf ist, ist es wahrscheinlich in Ordnung für eine relativ kleine Datenbank. Wenn Sie wegen der Leistung paranoid sind, verwenden Sie eine spezifische Abfrage für Ihre Datenbank(i.e. preferredTestQuery="SELECT 1")
maxIdleTimeExcessConnections
wird den connectionCount nach einer Aktivitätsspitze auf minPoolSize zurücksetzen.
Bitte beachten Sie, dass alle Pool-Eigenschaften (z. B. maxIdleTime
) wirkt sich nur auf Verbindungen aus, die sich im Pool befinden D.h. wenn Hibernate eine Verbindung aufgebaut hat und diese länger als maxIdleTime im Leerlauf hält und dann versucht, eine Operation auszuführen, erhalten Sie "Broken Pipe"
Es ist gut, weniger wait_timeout
zu haben auf mysql, aber es ist nicht immer richtig, wenn Sie eine Anwendung bereits erstellt haben. Sie müssen sicherstellen, bevor Sie sie reduzieren, dass Sie in Ihrer Anwendung die Verbindung nicht länger als wait_time
offen halten aus.
Sie müssen auch bedenken, dass der Erwerb einer Verbindung eine kostspielige Aufgabe ist und wenn die Wartezeit zu niedrig ist, wird der Zweck des Verbindungspools übertroffen, da häufig versucht wird, Verbindungen zu erwerben.
Dies ist besonders wichtig, wenn Sie die Verbindungsverwaltung nicht manuell durchführen, z. B. wenn Sie die transnationale Spring-API verwenden. Spring startet die Transaktion, wenn Sie einen @Transaction
eingeben annotierte Methode, sodass eine Verbindung vom Pool abgerufen wird. Wenn Sie einen Webdienstaufruf tätigen oder eine Datei lesen, die länger dauert als wait_time out, erhalten Sie eine Ausnahme.
Ich hatte dieses Problem einmal.
In einem meiner Projekte hatte ich einen Cron, der die Auftragsabwicklung für Kunden erledigte. Um es schneller zu machen, habe ich die Stapelverarbeitung verwendet. Jetzt rufe ich einmal eine Reihe von Kunden ab und mache etwas Verarbeitung (keine DB-Aufrufe). Wenn ich versuche, alle Bestellungen zu speichern, habe ich früher eine Rohrbruch-Ausnahme erhalten. Das Problem war, dass mein wait_timeout 1 Minute betrug und die Auftragsbearbeitung mehr Zeit in Anspruch nahm. Also mussten wir es auf 2 Minuten erhöhen. Ich hätte die Stapelgröße reduzieren können, aber das machte die Gesamtverarbeitung langsamer.