Was passiert, wenn ein Verbindungspool erschöpft ist?

8

Ich lese über SQLAlchemy Verbindungspooling, die eine Standardeinstellung von 5 Verbindungen hat und standardmäßig auf 10 überläuft.

Wenn die Anzahl der zwischengespeicherten Verbindungen überschritten wird, was passiert? Werden nachfolgende Anforderungen in die Warteschlange gestellt, bis eine freie Verbindung verfügbar ist oder wird eine neue Verbindung erstellt, die nicht in den Pool aufgenommen wird?

Was geschieht auch mit ungenutzten Verbindungen, wenn der Pool auf den Standardwert von 10 "übergelaufen" ist? Trennen sich diese Verbindungen nach der Standardzeit (wie beim Standardpool) oder werden sie aggressiver als der Standardpool freigegeben?

    
Matty 03.04.2012, 18:03
quelle

2 Antworten

13

Sie lesen gerade über den QueuePool, der Datenbankverbindungen für bessere Leistung verwaltet. Dazu werden offene Verbindungen geöffnet, falls Sie sie später erneut verwenden möchten. Die Anzahl der offenen Verbindungen ist pool_size = 5 (Standard). Wenn Sie eine sechste Verbindung öffnen, wird eine der Verbindungen in der Warteschlange geschlossen, solange sie inaktiv ist. Wenn keine im Leerlauf sind, öffnet der QueuePool zusätzliche, bis max_overflow = 10 (Standard). Mehr und Sie werden einen Fehler erhalten. Beide Parameter sind jedoch konfigurierbar. Setzen Sie pool_size = 0, um unbegrenzte offene Verbindungen zu haben. Die Quelle ist hier

    
Riaz Rizvi 03.04.2012, 18:44
quelle
4

Pro SQLAlchemy-Dokumentation ,

  

Wenn die Anzahl der ausgecheckten Verbindungen die in pool_size festgelegte Größe erreicht, werden zusätzliche Verbindungen bis zu diesem Limit zurückgegeben. Wenn diese zusätzlichen Verbindungen an den Pool zurückgegeben werden, werden sie getrennt und verworfen. Daraus folgt, dass die Gesamtzahl der gleichzeitigen Verbindungen, die der Pool zulässt, pool_size + max_overflow und die Gesamtzahl der "schlafenden" Verbindungen ist. Verbindungen, die der Pool erlaubt, ist pool_size .

Ja, übergelaufene Verbindungen werden aggressiver freigegeben als normalerweise schlafende Verbindungen.

Wenn Sie tatsächlich die Quellen von QueuePool._do_get() betrachten, sehen Sie, dass es eine TimeoutError auslöst, wenn die Verbindungsanzahl gleich Poolgröße + Überlauf ist und keine Verbindung zurück in den Pool zurückgegeben wird, nachdem connect() aufgerufen wurde .

    
9000 03.04.2012 18:31
quelle

Tags und Links