Discussion:
mySQL - Serielle Abarbeitung aus verschiedenen Threads heraus
(zu alt für eine Antwort)
Fritz
2014-12-11 18:52:02 UTC
Permalink
Tagchen!


Momentan habe ich einen Webserver (indy), der mit
einer mySQL-Datenbank kommuniziert. Diese Kommunikation
findet bei fast jedem http-Request (innerhalb des
entsprechenden Threads) statt und erzeugt jedes Mal
eine Verbindung zur Datenbank und belegt dementsprechend
auch jedes Mal einen Port. Heißt also im Klartext:
Wenn 65k Anfragen auf einmal kommen, ist der Webserver
platt, weil keine freien Ports mehr da sind für die Abfragen.



Die Lösung wäre, dass alle mySQL-Abfragen über eine einzige
TCP-Verbindung laufen. Hat jemand einen Tip, wie man das
hinbekommt? Das größte Problem ist imho, dass die jeweiligen
Verbindungsaufbauten aus unterschiedlichen Threads
gemacht werden. Das zweite Problem ist, dass meine aktuell
genutzte sql-komponente immer nur eine Abfrage pro Instanz
zulässt.


Gibt es dafür eine Datenbank-komponente, die man dafür
verwenden kann? Gibt es andere Möglichkeiten?



Bis dann
Fritz
M. Behrendt
2014-12-16 11:09:42 UTC
Permalink
Auch wenn ich wenig Ahnung davon habe:
Wenn wirklich viele Anfragen schnell hintereinander kommen, könnte man diese dann nicht in Listen sammeln und alle 1 oder 2 Sekunden eine Sammelanfrage an den Server schicken.
Also 1 Sekunde alle Anfragen sammeln, Liste füllen und dann Server ansprechen, die Ergebnisse zurück in die Liste und von dort aus zurück an den Anfragenden.
Das kann man dann multithreaded machen, 3 Threads, ein Thread pro Liste, sodass man 3 Listen hat die im Wechsel von 3 Sekunden "rotieren". Sollte genug Zeit sein zum Sammeln, Serverabfrage, Serverantwort speichern, zurück versenden und Liste leeren.
Oder mehr Threads um Listen übersichtlich zu halten, also z.B. max 100 Anfragen pro Liste.

Einem menschlichen Endnutzer würden 1-2 Sekunden zusätzlicher Wartezeit nicht viel ausmachen, bei zeitkritischer Einbindung in andere Prozesse macht es dann vielleicht schon etwas aus.
Stefan Graf
2014-12-16 20:53:53 UTC
Permalink
Post by Fritz
Momentan habe ich einen Webserver (indy), der mit
einer mySQL-Datenbank kommuniziert. Diese Kommunikation
findet bei fast jedem http-Request (innerhalb des
entsprechenden Threads) statt und erzeugt jedes Mal
eine Verbindung zur Datenbank und belegt dementsprechend
Wenn 65k Anfragen auf einmal kommen, ist der Webserver
platt, weil keine freien Ports mehr da sind für die Abfragen.
Die Lösung wäre, dass alle mySQL-Abfragen über eine einzige
TCP-Verbindung laufen. Hat jemand einen Tip, wie man das
hinbekommt? Das größte Problem ist imho, dass die jeweiligen
Verbindungsaufbauten aus unterschiedlichen Threads
gemacht werden. Das zweite Problem ist, dass meine aktuell
genutzte sql-komponente immer nur eine Abfrage pro Instanz
zulässt.
Gibt es dafür eine Datenbank-komponente, die man dafür
verwenden kann? Gibt es andere Möglichkeiten?
Ich vermute mal es werden eher 32k oder noch viel weniger seine. Je nach
dem wie MySQL eingestellt ist.
Wenn keine Sitzung mehr frei ist, kommt beim Aufbau des Connect eine
entsprechende Fehlermeldung

Dann warte man eben, bis wieder eine Port frei ist. Bei http ist das die
einzige Möglichkeit.
--
Stefan Graf
Stefan Graf
2014-12-16 20:55:46 UTC
Permalink
Post by Fritz
Momentan habe ich einen Webserver (indy), der mit
einer mySQL-Datenbank kommuniziert. Diese Kommunikation
findet bei fast jedem http-Request (innerhalb des
entsprechenden Threads) statt und erzeugt jedes Mal
eine Verbindung zur Datenbank und belegt dementsprechend
Wenn 65k Anfragen auf einmal kommen, ist der Webserver
platt, weil keine freien Ports mehr da sind für die Abfragen.
Die Lösung wäre, dass alle mySQL-Abfragen über eine einzige
TCP-Verbindung laufen. Hat jemand einen Tip, wie man das
hinbekommt? Das größte Problem ist imho, dass die jeweiligen
Verbindungsaufbauten aus unterschiedlichen Threads
gemacht werden. Das zweite Problem ist, dass meine aktuell
genutzte sql-komponente immer nur eine Abfrage pro Instanz
zulässt.
Gibt es dafür eine Datenbank-komponente, die man dafür
verwenden kann? Gibt es andere Möglichkeiten?
Hier noch der Entsprechende Link in die MySQL Docu

http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html
--
Stefan Graf
Jörg Achtenhagen
2014-12-17 06:31:08 UTC
Permalink
Post by Fritz
Die Lösung wäre, dass alle mySQL-Abfragen über eine einzige
TCP-Verbindung laufen. Hat jemand einen Tip, wie man das
hinbekommt? Das größte Problem ist imho, dass die jeweiligen
Verbindungsaufbauten aus unterschiedlichen Threads
gemacht werden. Das zweite Problem ist, dass meine aktuell
genutzte sql-komponente immer nur eine Abfrage pro Instanz
zulässt.
Gibt es dafür eine Datenbank-komponente, die man dafür
verwenden kann? Gibt es andere Möglichkeiten?
Wie wäre es wenn du dir ein ConnectionPool mit einer festen Anzahl von
Connections anlegst.

Hier gibt es schon was fertiges(fast).
http://edn.embarcadero.com/article/30027
Lese aber die Kommentare durch, es steckt noch ein Fehler im Source.
Post by Fritz
Bis dann
Fritz
--

Loading...