Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PDO ATTR_PERSISTENT vollständig verstehen

Apaches-Sicht

Apache hat einen übergeordneten Prozess. Dieser Prozess erstellt untergeordnete Prozesse, die alle an den Webserver eingehenden Anforderungen verarbeiten. Die anfängliche Anzahl untergeordneter Prozesse, die beim Start des Webservers gestartet werden, wird von StartServers konfiguriert Direktive in der Apache-Konfiguration. Die Zahl steigt nach Bedarf mit einer steigenden Anzahl von Anfragen, die den Webserver bis zum ServerLimit treffen erreicht ist.

PHP und dauerhafte Verbindungen

Wenn PHP (lief als mod_php, als CGI werden alle Ressourcen am Ende der Skriptausführung freigegeben) jetzt angewiesen wird, für eine Anfrage eine dauerhafte Verbindung mit einer Datenbank herzustellen, wird diese Verbindung auch nach Beendigung des Skripts gehalten. Die Verbindung wird jetzt ausgeführt Hold ist eine Verbindung zwischen dem untergeordneten Apache-Prozess, von dem die Anfrage bearbeitet wurde, und dem Datenbankserver und kann von jeder Anfrage wiederverwendet werden, die von genau diesem untergeordneten Prozess bearbeitet wird.

Wenn aus irgendeinem Grund (fragen Sie mich nicht genau warum) der untergeordnete Prozess länger als die eigentliche Anfrage belegt ist und eine andere Anfrage hereinkommt, leitet der übergeordnete Apache-Prozess diese Anfrage an einen (neuen) untergeordneten Prozess um, der möglicherweise noch nicht eingerichtet wurde bis zu diesem Zeitpunkt eine Verbindung zur Datenbank. Wenn dies während der Ausführung des Skripts erforderlich ist, wird die SID, wie Sie beobachtet haben, erhöht. Jetzt gibt es zwei Verbindungen, die von zwei verschiedenen Kindprozessen von Apache gehalten werden.

Denken Sie daran...

Es ist wichtig zu wissen, dass dies auch viele Probleme verursachen kann. Wenn während der Skriptausführung eine Endlosschleife oder eine abgebrochene Transaktion oder ein anderer möglicherweise sogar unvorhersehbarer Fehler auftritt, wird die Verbindung blockiert und kann nicht wiederverwendet werden .Außerdem kann es vorkommen, dass alle verfügbaren Verbindungen der Datenbank belegt sind, aber ein anderer untergeordneter Prozess des Apache-Servers versucht, auf die Datenbank zuzugreifen. Dieser Prozess wird vorerst blockiert, bis eine Verbindung von der Datenbank freigegeben wird oder Apache (Timeout oder freiwillig durch Kündigung). Weitere Informationen zu diesem Thema auf dieser Seite:http://www.php.net/manual/en/features.persistent-connections.php

Ich hoffe, ich habe alles, was wir in unserem Kommentargespräch besprochen haben, richtig zusammengefasst und nichts vergessen. Wenn ja, hinterlasse mir bitte einen Hinweis und ich werde ihn ergänzen. :)

Bearbeiten:

Ich habe gerade den in diesem Kommentar erwähnten Artikel @MonkeyZeus gelesen. Er beschreibt den Prozess, den ich oben zusammengefasst habe, und bietet nützliche Informationen darüber, wie Sie Ihren Apache-Server optimieren können, damit er besser mit dauerhaften Verbindungen zusammenarbeitet. Er kann mit oder ohne Oracle-Datenbank-Backends verwendet werden. obwohl.Sie sollten einen Blick darauf werfen:http://www.oracle.com/technetwork/articles/coggeshall-persist-084844.html