Rolf B: mysqli Datenbank zwischen zwei Abfragen schließen?

Beitrag lesen

Hallo Fred,

das ist tatsächlich nicht ganz eindeutig. Aber nur in Fragestellungen zu Durchsatz bei stark belasteten Webservern.

Ein Trainer hat mir in einer Fortbildung mal gesagt, dass DB Connections wie heiße Kartoffeln zu behandeln sind. Schnappen, verwenden und schnell wieder fallen lassen. Aber wie zu jeder Kartoffel gehört auch zu dieser Aussage eine kräftige Prise Salz.

Das Kartoffelprinzip gilt nämlich nur, wenn geschlossene Connections gar nicht wirklich geschlossen werden, sondern im Hintergrund bereitgehalten und wiederverwendet werden. Und dieser Pool aus bereitgehaltenen Connections muss für mehr als einen PHP Prozess verfügbar sein, denn ein einzelner PHP Prozess führt zu einem Zeitpunkt immer nur ein Script aus. Sowas geht, dafür gibt's unter Windows und auch Linux den ODBC-Treiber mit Connection Pooling. Hab ich so gelesen. Aber noch nie selbst gemacht.

Andere Systeme wie ASP.NET machen das ähnlich, da läuft ein asp.net Prozess der die Connections im Pool hält und er macht fleißig Threads auf, um Requests zu verarbeiten. Die können dann auf den Pool zugreifen.

In diesem Szenario kann das Kartoffelprinzip dazu führen, dass man mit einem Pool aus 100 Connections mehr Requests parallel verarbeiten kann. Wenn jeder Request aus irgendeinem Grund 5 Connections öffnet, dann ist nach dem 20. laufenden Request Schluss. Die übrigen laufen auf einen Timeout oder warten. Wenn aber jeder Request seine Connections immer nur kurz aufmacht, dann können sich die DB Zugriffe ineinander verzahnen und mehr Requests erlauben. Wobei man für 20 parallel laufende Requests schon eine Menge Nüsse knacken muss, um genug Kerne zu haben.

Der normale FastCGI PHP Prozess hat aber pro Request genau ein PHP laufen, und das behält seine Connections für sich und teilt sie mit niemanden. In diesem Szenario kannst Du deine Connections zu Beginn aufmachen, damit alle Zugriffe durchführen und... sie dann vergessen. Denn PHP schließt sie beim Programmende sowieso.

Explizit Schließen musst Du eine Connection nur dann, wenn zwischen ihrer letzten Verwendung und dem Script-Ende eine Menge Zeit vergeht (z.B. mehr als eine halbe Sekunde). Andernfalls ist das komplett Wurscht.

Es gibt auch Fälle, wo man eine Hauptconnection hat und nur für eine einzige Operation eine Zweitconnection braucht. Diese Zweitconnection kann man nach Gebrauch wieder explizit schließen.

Rolf

--
sumpsi - posui - obstruxi