0

Ich sehe, dass Leerlaufverbindungen nicht gelöscht werden. Ich bin mir nicht sicher, was der Grund ist?DBCP2 BasicDataSource Inaktive Verbindungen werden nicht gelöscht

Urspr-10 maxtotal-20 maxIdle-10 minidle-0 minEvictableIdleTimeMillis-30min numTestsPerEvictionRun-60min numTestsPerEvictionRun-20 testOnBorrow-true testWhileIdle-true validation-select 1 von dual

Von verschiedenen Quellen vorausgesetzt das folgende ist mein Verständnis maxtotal- maxactive Verbindungen zu Datenquelle, die 20 in oben genannten Fall ist

maxidle - Anzahl der Verbindungen im Leerlauf, die im Pool verbleiben können. diese werden vom Kehrer entfernt. Im obigen Fall ist eine Verbindung inaktiv, wenn sie 30 Minuten lang inaktiv ist. Wenn der Sweeper alle 60 Minuten läuft, prüft er 20 freie Verbindungen zu und löscht ungenutzte Verbindungen. Leerlaufverbindungen, die diese überschreiten, werden sofort geschlossen.

Ist das obige Verständnis korrekt?

ich BasicDataSourceMXBean verwende die Statistiken zu drucken

{ "NumActive": "0", "NumIdle": "10", "isClosed": "false", "maxTotal": "20",“ MaxIdle ":" 10 "," MinIdle ":" 0 "}

Die Leerlaufverbindungen werden nie gelöscht, obwohl kein Datenverkehr vorhanden ist. Ist in der obigen Konfiguration etwas falsch?

Auch was ist minIdle und wann sollten wir es auf einen Wert ungleich null setzen?

Kürzlich aktualisierte Hibernate-Version von 3.6.0.Final zu überwintern 4.3.11.Final und Frühjahr 4.2.9 von älteren Frühjahr-Version.

Früher wurden die Leerlaufverbindungen gelöscht. Aber seit dem Upgrade werden die Leerlaufverbindungen nicht gelöscht.

+0

Sind Sie sicher, dass die Einstellung nicht "testWhileIdle" anstelle von "testOnIdle" sein sollte, damit inaktive Verbindungen entfernt werden? – Naros

Antwort

0

Überall wo ich gesucht habe, scheint es, dass die Eigenschaft testWhileIdle anstatt testOnIdle sein sollte. Die Einstellung ist standardmäßig false, sodass Ihre Leerlauf-Threads nicht auf ihre Gültigkeit getestet werden und daher nicht entfernt werden.

Die minIdle teilt dem Verbindungspool grundsätzlich mit, wie viele Leerlaufthreads zulässig sind. Es ist mein Verständnis aus der Dokumentation, dass wenn minIdle0 ist, sollte es keine Leerlaufverbindungen geben.

Normalerweise ist minIdle standardmäßig auf denselben Wert wie initialSize eingestellt.

+0

seine testWhileIdle. Ich verstehe immer noch nicht, warum es nach 90min Leerlaufverbindungen gibt. Gibt es ein Szenario, in dem Leerlaufverbindungen niemals gelöscht werden würden? – Anonymous7

0

Ich sehe, dass Leerlaufverbindungen nicht gelöscht werden. Ich bin mir nicht sicher was der Grund ist?

https://commons.apache.org/proper/commons-dbcp/configuration.html

Die testWhileIdle vs. testOnIdle Problem, das andere haben darauf hingewiesen, sollte Ihre Frage, warum die Verbindungen im Leerlauf geöffnet bleiben lösen. Sie haben recht, wenn Sie davon ausgehen, dass Ihre initialSize = 10 Verbindungen von der Räumungsmaschine bei der 60-Minuten-Marke gelöscht werden, um Sie auf minIdle = 0 zu bringen.Warum möchtest du eine minIdle = 0 haben, ist eine andere Frage? Der eigentliche Sinn des Connection-Pooling besteht darin, Ihre Verbindungen vorab zu authentifizieren, zu testen und einzurichten, damit sie in Ihrem Pool "Leerlauf" bleiben und von eingehenden Anfragen "ausleihen" können. Dies verbessert die Leistung, indem die Ausführungszeit auf nur die SQL-Sitzung reduziert wird.

Auch was ist minIdle und wann sollten wir es auf einen Wert ungleich null setzen?

Diese Verbindungen im Leerlauf führen zu Wartezeiten für Ihre zukünftigen SQL-Anfragen. Die minimale Größe hängt von Ihrer Anwendung ab, aber der Standardwert von DBCP2 ist 8 und wahrscheinlich kein schlechter Startpunkt. Die Idee ist es, genug zur Hand zu haben, um mit der durchschnittlichen Nachfrage auf dem Pool Schritt zu halten. Sie würden einen Höchstwert festlegen, um mit diesen Spitzenzeiten umzugehen, wenn Sie Verkehrsstaus haben. Die testWhileIdle = true-Konfiguration, die Sie angewendet haben, führt die ValidationQuery aus, wenn der Sweeper herumkommt, testet aber standardmäßig nur 3 Verbindungen pro Lauf. Sie können numTestsPerEvictionRun auf eine höhere Nummer konfigurieren, wenn Sie mehr testen möchten. Diese "Tests" stellen sicher, dass Ihre Verbindungen noch in einem guten Zustand sind, so dass Sie während der Ausführung keine "schlechte" inaktive Verbindung aus dem Pool erhalten.

Ich vermute, dass Sie mehr mit "hängen" Verbindungen statt "Leerlauf" Verbindungen betroffen sein können. Wenn dies der Fall ist, sollten Sie die "abgebrochenen" Konfigurationen überprüfen, die "aktive" Verbindungen zerstören sollen, die länger als X laufen. removeAbandonedOnMaintenance = true zusammen mit removeAbandonedTimeout = {numberOfSecondsBeforeEigibleForRemoval}.

Verwandte Themen