mmofacts.com

Connection Pooling

gepostet vor 18 Jahre, 6 Monate von Amun Ra
Mir ist aufgefallen, das in so gut wie jedem meiner Scripts der mysql_connect()
ca. 25 - 50 % der Rechenzeit in Anspruch nimmt.
( Ausser bei sehr aufwendigen Berechnungen oder DB Operationen,
die aber meist kontrolliert per Cronjob gesteuert werden. )
Da kann man noch sie viel am Code feilen und ändern,
der mysql_connect() bleibt der Flaschenhals...
Das ist natürlich offensichtlich schlecht und nicht Sinn der Sache !

Ich hab mich eben schon mal ein wenig durchs Netz gegoogled
und ich glaube die Lösung heisst Connection Pooling in irgendeiner Form.
Ich hab da erstmal auf die schnelle mod_dbd fürn Apache
und halt das ganz normale mysql_pconnect() gefunden.

Wer hat sich denn schon mal intensiv mit der Lösung dieses Problems
befasst und möchte mal ein wenig was ausplaudern ??

EDIT: Ach so, es geht um WAMP bzw. LAMP.
gepostet vor 18 Jahre, 6 Monate von Kampfhoernchen
versuch doch mal mysql_pconnect()
gepostet vor 18 Jahre, 6 Monate von TheUndeadable
Unter PHP nutze ich eigentlich nur mysql_pconnect. Hat bisher immer einwandfrei funktioniert. (Voraussetzungen: Einbindung als Modul in den Apache, nicht als CGI, wie es bei lighthttp aussieht: Keine Ahnung).

BTW: 'Andere Systeme als PHP' bieten im Regelfall nur ConnectionPooling an, bzw der MySQL-ADO.Net-Provider (entspricht einem Datenbanktreiber) hat ein internes Connection-Pooling
gepostet vor 18 Jahre, 6 Monate von ali.k.
kann meinen Vorrednern nur zustimmen. Gerade bei Browsergames mit vielen Hits ist ne persistente Verbindung wichtig... Hätte allerdings nicht vermutet, dass es 25% - 50% ausmacht!
gepostet vor 18 Jahre, 6 Monate von HSINC
solltest aber aufpassen bei pconnect das die verbindung nicht geschlossen wird, das hat zb auswirkungen auf transactions, da eben die verbindung offen bleibt und nicht abgeschlossen wird
gepostet vor 18 Jahre, 6 Monate von Mudder
PDO in PHP5 kennt auch nur die "normalen" perisistenten Verbindungen, oder? Also nicht noch irgendwelche zusätzlichen Methoden?
gepostet vor 18 Jahre, 6 Monate von exception
Wenn man persistente Connections nutzt, sollte man aber auch genau aufpassen, bei mysql den Wert max_connections ausreichend hoch zu setzen. Der Standardwert liegt nur bei 100. Wenn man nun also 500 Webserver-Prozesse laufen hat, könnte es etwas eng werden

Performance-Unterschiede waren laut meinen Messungen relativ gering, zwar messbar aber deutlich unter 10% (localhost DB-Server oder Webserver und DB-Server per Cross-Over verbunden).
gepostet vor 18 Jahre, 6 Monate von Julbrygd
Wie lange bleibt denn so eine pconnect-Verbindung dann bestehen?
gepostet vor 18 Jahre, 6 Monate von Fornax
Ich fühle mich gerade an einen anderen aktuellen Thread erinnert.

RTFM!

http://www.php.net/manual/de/features.persistent-connections.php

http://www.php.net/manual/de/function.mysql-pconnect.php

Die Verbindung zum SQL Server wird beim Beenden des PHP-Skripts nicht geschlossen. Sie bleibt zur zukünftigen Verwendung bestehen. (mysql_close() schließt keine von mysql_pconnect() geöffneten Verbindungen).


EDIT: Man kann sie nicht schließen. Desshalb habe ich bei mir auch über 10 connections, und wie im Text bschrieben, sollte man aufpassen, dass max_connections nicht überschritten werden (also angehoben werden, wenns eng wird).
gepostet vor 18 Jahre, 6 Monate von BLUESCREEN
Die Frage ist doch: Wenn zu einem Zeitpunkt 1000 Verbindungen gleichzeitig gebraucht und damit geöffnet werden, werden die dann anschleißend wirklich alle offengehalten, obwohl man zu 99.99% der Laufzeit nur 100 davon braucht oder gibt es bei der Anzahl eine Obergrenze, so dass nach einem Peak zumindest einige wieder geschlossen werden?

Im Manual wird zwar keine Situation beschrieben, in der eine persistente Verbindung geschlossen wird, aber deshalb kann man ja nicht gleich den Umkehrschluss ziehen, dass dies wirklich nie passiert.
gepostet vor 18 Jahre, 6 Monate von Fornax
hm, stimmt, da habt ihr recht. Ich habe gerade mal gegoogled und bin hiereauf gestoßen: mysql_kill()
gepostet vor 18 Jahre, 6 Monate von Störti
Laut PHP.net gibt es nur mysqli_kill, mysql_kill gibt es nicht.

Alelrdings kann man das ja mit
$sql = "KILL $thread_id";
machen, allerdings frage ich mich, was dann gekillt wird, die Verbindung oder nur der Prozess, der die Verbindung bearbeitet (oder ist beides das selbe?).
gepostet vor 18 Jahre, 6 Monate von Amun Ra
@ Fornax, ich fühle mich bei diesem Thread nicht an den besagten anderen erinnert !
Glaub mir, ich hab das fucking manual vorher gelesen,
nicht nur einmal...
Ich war mir der Existenz von pconnect() sehr wohl bewusst.
Ich wollte halt mal rum hören, was hier so genutzt wird,
ob mancher andere Wege gegangen ist,
ob sich vielleicht mal ein Javaentwickler meldet usw...
gepostet vor 18 Jahre, 6 Monate von mifritscher
hmm. spätestens dann wenn die Apache-prozesse wieder gekillt werden, wenn weniger los ist?
gepostet vor 18 Jahre, 6 Monate von Fornax
@Amun Ra:
Dich hatte ich damit nicht gemeint, sondern eher das hier:

Original von Julbrygd

Wie lange bleibt denn so eine pconnect-Verbindung dann bestehen?

Tut mir leid, evtl habe ich etwas überreagiert, ich war aus privaten Gründen nicht so gut drauf :roll:


@Störti:
Ich hatte leider nicht bei php.net geguckt, sondern nur mal schnell gegoogled ...

@mifritscher:
Du hast recht, ich habe es eben lokal ausprobiert, wenn ich den Apache stoppe, werden alle connections geschlossen

Auf diese Diskussion antworten