mysql_unbuffered_query

G

Guest

Guest
Hallo,

Zu mysql_unbuffered_query ist mir nicht ganz klar, wie lange die Connection für andere Queries blockiert ist.
d.h genauer kann man mysql_unbuffered_query benutzen und gleichzeitig mit einer weiteren Connection eine neue Instanz der angesprochenen Tabellen öffnen?

Gruss

Tümmel
 
Hallo,

ich glaube nicht, zumindestens wüsste ich nicht, dass man mit PHP einfach so einzelne Threads erstellen kann.
Man könnte es vermutlich über einen Workaround realisieren, doch wäre es eine ziemlich unschöne Lösung. Ich hatte mir mal so einen Workaround ausgedacht, aber nie verwendet und müsste nun noch der entsprechenden Funktion dafür erst suchen. Doch würde ich eine solche Idee besser verwerfen, dann solltest Du besser eine höhre Programmiersprache verwenden anstelle einer Scriptsprache.



MfG Sascha Ahlers
 
Hallo,

Jetzt hab ich 's mal ausprobiert.
Wenn man beim Verbindungsaufbau
mysql_connect ( [string Server [, string Benutzername [, string Benutzerkennwort [, bool neue_Verbindung [, int client_flags]]]]] )

neue_Verbindung auf true setzt funktioniert's.

$link1 = mysql_connect($aha->host,$aha->user,$aha->pass) or die("Keine Verbindung möglich: " . mysql_error());
$sel1=mysql_select_db($aha->db) or die("Auswahl der Datenbank fehlgeschlagen".mysql_error());

$link2 = mysql_connect($aha->host,$aha->user,$aha->pass,true) or die("Keine Verbindung möglich: " . mysql_error());
$sel2=mysql_select_db($aha->db) or die("Auswahl der Datenbank fehlgeschlagen".mysql_error());

Sonst wird auf die bereits bestehende Connection zugegriffen und der unbuffered_query zerstört.

getestet:
$rs=mysql_unbuffered_query($sql,$link1)or die(mysql_ERROR());
$rss=mysql_query($sql,$link2)or die(mysql_ERROR());
$rnn=mysql_num_rows($rss);

print mysql_thread_id($link1).'connection 1<br>';
print mysql_thread_id($link2).'connection 2<br>';

while($rff=mysql_fetch_row($rss))print 'connection 1 '.$rff[0].' '.($rff[1]) .' '.$rff[2].'<br>';
while($rf=mysql_fetch_row($rs))print 'connection 2 '.$rf[0].' '.($rf[1]) .' '.$rf[2].'<br>';

mysql_close($link1);
mysql_close($link2);


highspeed Grüsse
biggrin.gif


Tümmel
 
Nett, habe ich auch mal etwas dazugelernt.
Das funktioniert wohl leider nur bei MySQL-Abfragen, oder? :-(

<edit>
Einige anderen Datenbank Erweiterungen unterstützen wohl auch Thread, nur finde ich es leider nicht innerhalb der PDO-Erweiterung
</edit>



MfG Sascha Ahlers
 
Hallo Sascha,

Da müsste ich ganz tief im Keller graben, um zu schauen, ob das auch mit der ohnehin bedenklich langsamen jet funktioniert. Irgendwie hab ich aber so was aber noch im Hinterkopf.

Gruss

Tümmel
 
Was ist Jet? Ich bewege mich nicht unbedingt all zu sehr aus außerhalb von den offiziellen PHP Seiten und die meisten Funktionen schreibe ich mir selber.


Ich hatte vor einigen Jahren auch mal die Idee irgendwie einen weiteren PHP Prozess zu starten über die Kommandozeilen Funktionen, doch das wäre ein richtig mieser Workaround.

Ich glaube, meine Überlegung ging dahin mit einer Kommandozeilen-Funktionen von PHP ein Kommandozeilen-Script aufzurufen, und von dort aus wieder ein anderes Kommandozeilen-Script aufrufen, welches dann unabhängig von dem ersten Kommandozeilen-Script arbeitet. Also wie gesagt, es ist eigentlich ein richtig mieser Workaround, und würde sich auch nur für große Abarbeitungen eignen.



MfG Sascha Ahlers
 
Interessant finde ich noch, das
mysql_unbuffered_querymit mysql_fetch_row($result) bei einem leeren Ergebnis im Gegensatz
zu mysql_query keine Fehlermeldung bringt.

Wenn man keine weitere Datensatznavigation braucht oder die Connection pingt,
lohnt sich der Einsatz sich trotz der Empfindlichkeit in jeder Hinsicht.

Editiert:
Jet war(ist?) ms-Standard für access und visual basic Applikationen.
Sowas ähnlich wie mit den Kommandozeilen hatte ich mal für ein Ingenieurbüro in VB gemacht um mehrere Datenbanken zusammenzuführen, aber ab 20000 Datensätzen knickt die Verbindung ein.
Jetgeschädigt bedeutet: ab 10000 Datensätze 2 Sekunden, ab 20000 Datensätze 1 min und dann exponential ansteigend.

Das monatliches Komprimierungsupdate für mein derzeitiges Projekt schreibt aus zwei Tabellen unbrenzter Grösse die analysierten Daten in 16 andere Basistabellen, sodass bei dem Ergebnis sogar ein Mehrwert an Info entsteht. (2 Tabellen werden monatlich neu generiert, 2 kommen jeden Monat hinzu,8 jährlich kommen jährlich hinzu und 4 bleiben konstant). Anschliessend werden die beiden Tabellen entleert.

Jetzt mit dem mysql_unbuffered_query sollte ich auch mit einem kleinen Homeserver und nur 300k unshared upload ziemlich
gut mithalten können.

Gruss

Tümmel
 
Zurück
Oben