it-swarm.com.de

Nachteil großer "maximaler Verbindungen" in einem Verbindungspool aus einer Web-App

Ich verstehe, dass Sie, wenn Sie Datenbankverbindungen überhaupt nicht bündeln, den Aufwand tragen müssen, jedes Mal eine neue Datenbankverbindung herzustellen, wenn Sie die Datenbank abfragen müssen, was Ihre App verlangsamt, und dass Sie diesen Aufwand durch Pooling sparen.

Wenn Sie Ihre maximale Poolgröße zu klein einstellen - beispielsweise auf maximal 1 Verbindung -, muss Ihre App diese einzelne Datenbankverbindung für alle Anforderungen freigeben, und die Anforderungen müssen warten, bis die vorherige abgeschlossen ist die Datenbankverbindung, bevor sie aus dem Pool abgerufen und wiederverwendet werden können.

Aber was ist, wenn Sie nur Ihre maximale Poolgröße wirklich groß einstellen, wie z. B. maximal 1000 Verbindungen? Sollte es dann nicht die Wiederverwendung von Verbindungen gegenüber dem Aufbau neuer Verbindungen bevorzugen und die Poolgröße nur dann maximal nutzen, wenn dies tatsächlich erforderlich ist, um die Nachfrage zu bedienen?

Was ist der Nachteil, wenn Verbindungspools größer gemacht werden müssen, als sie benötigen, um die Anforderungen der App zu erfüllen, vorausgesetzt, nicht verwendete Verbindungen werden nach einer Leerlaufzeit geschlossen/aus dem Pool entfernt?

3
joshua.paling

Ich verstehe, dass Sie, wenn Sie Datenbankverbindungen überhaupt nicht bündeln, den Aufwand tragen müssen, jedes Mal eine neue Datenbankverbindung herzustellen, wenn Sie die Datenbank abfragen müssen, was Ihre App verlangsamt, und dass Sie diesen Aufwand durch Pooling sparen.

Im Allgemeinen, aber es hängt davon ab ... Wenn es sich um einen langlebigen Prozess oder eine Verbindung handelt, kann eine dedizierte Verbindung leistungsfähiger sein und weniger Overhead verursachen.

Wenn Sie Ihre maximale Poolgröße zu klein einstellen - beispielsweise auf maximal 1 Verbindung -, muss Ihre App diese einzelne Datenbankverbindung für alle Anforderungen freigeben, und die Anforderungen müssen warten, bis die vorherige abgeschlossen ist die Datenbankverbindung, bevor sie aus dem Pool abgerufen und wiederverwendet werden können.

Sie könnten auch einen Fehler bekommen. Ich würde nicht davon ausgehen, dass es perfekt multiplexen wird. Aus diesem Grund kann eine zu niedrige Einstellung des Werts Maximum nachteilige Auswirkungen haben (auch eine zu hohe Einstellung!).

Aber was ist, wenn Sie nur Ihre maximale Poolgröße wirklich groß einstellen, wie z. B. maximal 1000 Verbindungen? Sollte es dann nicht die Wiederverwendung von Verbindungen gegenüber dem Aufbau neuer Verbindungen bevorzugen und die Poolgröße nur dann maximal nutzen, wenn dies tatsächlich erforderlich ist, um die Nachfrage zu bedienen?

Ich würde sagen, wenn 1000 gleichzeitige Verbindungen nichts in Ihrer App-/Datenbankverarbeitung stören, dann versuchen Sie es. Realistisch gesehen sollte es nicht erforderlich sein, 1000 gleichzeitige Anforderungen aus demselben Pool auf demselben App-Server zu erfüllen, es sei denn, diese App wird extrem populär oder es gibt ein Problem in der App/Datenbank. Wenn dies der Fall ist, wird der App-Server wahrscheinlich vor dem Datenbankserver beendet (möglicherweise nicht, abhängig von Hardware und Konfiguration), oder es tritt ein Problem mit der Parallelität auf Datenbankebene auf (wiederum abhängig).

Dadurch kann der Pool wachsen, der Datenbankserver wird jedoch hoffentlich nicht überlastet. Wenn Sie alle 10 App-Server eingestellt haben, können 10.000 Verbindungen ein Problem sein. Selbst in diesem einfachen Beispiel gibt es viele bewegliche Teile, aber ich versuche optimistisch zu sein.

Was ist der Nachteil, wenn Verbindungspools größer gemacht werden müssen, als sie benötigen, um die Anforderungen der App zu erfüllen, vorausgesetzt, nicht verwendete Verbindungen werden nach einer Leerlaufzeit geschlossen/aus dem Pool entfernt?

Der Nachteil ist, dass Sie:

  • Überwältigen Sie die Datenbank
  • Überwältigen Sie den Anwendungsserver
  • Haben Sie einen hohen Overhead zum Auf- und Abbau von Verbindungen

Schließlich werden die Verbindungen entfernt und freigegeben, aber das Einrichten erfordert Ressourcen und Zeit. Der Zweck des Pools besteht darin, diese Ressourcen wiederzuverwenden, um die Kosten und den Ressourcenverbrauch insgesamt zu reduzieren.

4
Sean Gallardy

Die standardmäßige maximale Poolgröße beträgt 100 und man sollte sich im Allgemeinen daran halten, es sei denn, es gibt spezielle Anforderungen. Wenn Sie die maximale Größe der Verbindungspools höher einstellen, können so viele Abfragen gleichzeitig an die Datenbank gesendet werden, und Probleme wie Langzeitblockierung oder lang laufende Abfragen können sich verschlimmern.

Nicht verwendete gepoolte Verbindungen werden immer wieder verwendet, bevor eine neue hergestellt wird. Nicht verwendete gepoolte Verbindungen werden auch physisch geschlossen, wenn sie einige Minuten lang nicht wiederverwendet werden, wodurch serverseitige Ressourcen freigegeben werden.

5
Dan Guzman

Es gibt Einschränkungen, um eine außer Kontrolle geratene Ressourcennutzung zu verhindern. Wenn Sie sicher sind, dass Ihre Datenbank während der höchsten Ladezeit 1000 gleichzeitige Verbindungen verarbeiten kann (da genau zu diesem Zeitpunkt die Poolnutzung am höchsten ist) und kein anderer Anwendungsserver gleichzeitig ausgeführt wird, gibt es keinen Wenn Sie die Poolgröße auf 1000 einstellen, entscheiden Sie sich im Wesentlichen für das, was Sie blockieren möchten - Ihren Datenbankserver oder Ihren Anwendungsserver.

3
mustaccio