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

Problem mit dem Verbindungspool

Hier ist der Ablauf der Ereignisse, um zu veranschaulichen, was passiert:

  1. Eine Verbindung wird vom Aufrufer angefordert und verwendet (Anwendung oder Verbindungspool)
  2. Der Anrufer behält einen Verweis darauf, damit die Verbindung wiederverwendet werden kann
  3. Der Anrufer durchläuft einen Zeitraum der Inaktivität (z. B. ein Entwicklungssystem über Nacht oder ein QA-System über das Wochenende).
  4. Sobald diese Datenbankverbindung nicht verwendet wird, betrachtet die Datenbank die Verbindung als inaktiv. Da sie inaktiv ist, schließt die Datenbank nach einer bestimmten Zeit (MySQL-Standard ist 8 Stunden) die Verbindung.
  5. Der Anrufer hat immer noch ein Handle für die Verbindung, und wenn der Anrufer versucht, die Verbindung erneut zu verwenden, stellt er unangenehmerweise fest, dass die Verbindung geschlossen wurde.

Der Grund, warum autoReconnect=true funktioniert und dass der Pool, der die Gültigkeit der Verbindung testet, funktioniert, liegt darin, dass Sie das aufrufende System anweisen, die Verbindung für diese Situation zu testen und es erneut zu versuchen, wenn diese Situation eintritt.

Ob sich die Validierungsabfrage auf die Leistung auswirkt:Theoretisch wird eine Verbindung verwendet, um etwas zu tun. In der Praxis ist das so trivial, dass seine Wirkung im Kontext Ihres gesamten Systems vernachlässigbar ist.

[BEARBEITEN]

In diesem Fall ist Apache DBCP der Verbindungspool, der an der Verbindung hängt, aber Sie möchten NICHT, dass DBCP die Verbindung nach jedem Aufruf schließt. Sinn und Zweck des Verbindungspools ist es, eine Verbindung für den nächsten Anruf bereitzuhalten, da der Aufbau von Verbindungen teuer ist. Die vom Pool verwalteten Verbindungsobjekte werden durch tatsächliche Datenbankverbindungen unterstützt, und die Datenbank ist diejenige, die diese tatsächliche Verbindung nach Ablauf des Leerlaufzeitlimits schließt. Beachten Sie, dass das Timeout zum Schließen von Leerlaufverbindungen in der Datenbank und nicht im Verbindungspool konfiguriert wird. Aus diesem Grund hat DBCP keine Möglichkeit zu wissen, ob die Verbindung geschlossen wurde oder nicht, es sei denn, es versucht tatsächlich, eine Verbindung herzustellen. Aus diesem Grund benötigen Sie eine Validierungsabfrage.

Weitere Informationen zum Konfigurieren von DBCP finden Sie auf der Konfigurationsseite und die API-Dokumentation .