Pooling von Datenbankverbindungen richtig einsetzen

Hallo zusammen,

wir haben hier eine Konstellation, welche immer mal wieder zu Poolproblemen führt und zu Fehlern wie “zu viele Verbindungen” führt oder auch banal zu Verzögerungen bei DB-Anfragen.

Wir betreiben einen Webservice, dieser bedient auf einem PSQL-Server viele Datenbanken. Welche Datenbank zu verwenden ist, wird anhand der Mailadresse ermittelt, welche einen Endpunkt anspricht. Dabei geht der Webservice zunächst in eine bestimmte Datenbank, in welcher eine Zuordnungstabelle zwischen E-Mail und Ziel-Datenbank liegt.

Jeder Aufruf eines Endpunktes erzwingt somit die Verbindung zur Zuordnungs-Datenbank und danach die Verbindung zur eigentlichen Ziel-Datenbank. Die Verbindung wird ganz normal geöffnet und danach wieder geschlossen. Im Connectionstring wird das Flag “WithPooling” auf “true” gesetzt. Ich gehe davon aus, dass der Datenbankserver hier in irgendeiner Form die Connections poolt.

Jeder Aufruf eines Endpunktes kommt allerdings immer mit einem neuem Thread daher. Dies verhindert zum Beispiel, dass ich die Connections selber in einem Dictionary o.ä. aufheben kann, den ein threadübergreifendes Verwenden einer Connection geht nicht. Jeder einzelne Aufruf eines Endpunktes - auch zur gleichen Datenbank - erzwingt also eine neue (i.d.R. kurzlebige) Verbindung.

Was kann man nun tun, um die Verbindung zur DB so effektiv wie möglich zu gestalten?

Viele Grüße, Karsten Heimer.

Postgres hat kein Pooling eingebaut. Dieses Flag muss also von der Software bzw. Bibliotheken ausgewertet werden, die ihr einsetzt.

Wenn eure Software aber kein Connection Pooling kann, dann müsst ihr einen externen Pooler wie z.B. pgBouncer oder PgCat vor die Datenbank setzen.

1 „Gefällt mir“

Hm, wir benutzen den Treiber von “devart”, dort steht in der Beschreibung was von “Advanced connection pooling”, dass klingt ja schon mal gut. Ansonsten werden wir uns mit dem “pgBouncer” beschäftigen, der liest sich recht praktisch und offenbar muss man in der Clientconnection lediglich den Port wechseln, um ihn zu nutzen.

Ja, Connection Pooling im Applikationsserver ist das Beste.
Allerdings gibt es einen Fall, wo das nicht gut genug ist: wenn die Applikation so lahm ist, daß man mit der Workload nicht anders fertig werden kann, als daß man 27 Instanzen des Applikationsservers startet. Dann sind es 27 Connection Pools, und selbst wenn jeder einzelne vernünftig dimensioniert ist, ist das Ganze kein effektives Pooling mehr.
Dann braucht man einen externen Pooler wie pgBouncer, normalerweise auf der Datenbankmaschine.