598 MySQL - Technische Referenz f¨ur Version 5.0.1-alpha
mysys-Bibliothek benutzen, m ¨ussen Sie lediglich daran denken, my_init() zuerst
aufzurufen! Siehe Abschnitt 9.4.4 [C Thread functions], Seite 592.
Alle Funktionen ausser mysql_real_connect() sind vorgabem¨aßig Thread-sicher. Die fol-
genden Hinweise beschreiben, wie man eine Thread-sichere Client-Bibliothek kompiliert
und sie auf Thread-sichere Weise benutzt. (Die unten stehenden Hinweise f¨ur mysql_
real_connect() beziehen sich in der Tat auch auf mysql_connect(). Weil aber mysql_
connect() veraltet ist, sollten Sie in jedem Fall mysql_real_connect() benutzen.)
Um mysql_real_connect() Thread-sicher zu machen, m¨ussen Sie die Client-Bibliothek
mit diesem Befehl neu kompilieren:
shell> ./configure --enable-thread-safe-client
Das erzeugt eine Thread-sichere Client-Bibliothek libmysqlclient_r. --enable-thread-
safe-client. Diese Bibliothek ist pro Verbindung Thread-sicher. Sie k¨onnen zwei Threads
dieselbe Verbindung benutzen lassen, solange Sie folgendes tun:
• Zwei Threads k¨onnen zur gleichen Zeit keine Anfrage an MySQL ¨ub er dieselbe
Verbindung schicken. Insbesondere m¨ussen Sie sicherstellen, dass zwischen einem
mysql_query() und einem mysql_store_result() kein anderer Thread dieselbe
Verbindung benutzt.
• Viele Threads k¨onnen auf unterschiedliche Ergebnismengen zugreifen, die mit mysql_
store_result() a/jointfilesconvert/293675/bgerufen wurden.
• Wenn Sie mysql_use_result benutzen, m¨ussen Sie sicherstellen, dass kein anderer
Thread irgend etwas ¨uber dieselbe Verbindung anfragt, bis die Ergebnismenge
geschlossen wurde. F¨ur threaded Clients, die dieselbe Verbindung benutzen, ist es
jedoch am besten, mysql_use_result() zu benutzen.
•
Wenn Sie mehrfache Threads ¨ub er dieselbe Verbindung benutzen wollen, m¨ussen Sie
eine mutex-Sperre um Ihre mysql_query()- und mysql_store_result()-Aufruf-
Kombination haben. Sobald mysql_store_result() fertig ist, kann die Sperre
aufgehoben werden und andere Threads k¨onnen ¨uber dieselbe Verbindung anfragen.
• Wenn Sie mit POSIX-Threads programmieren, k¨onnen Sie pthread_mutex_lock()
und pthread_mutex_unlock() benutzen, um eine mutex-Sperre aufzubauen und
aufzuheben.
Sie m¨ussen folgendes wissen, wenn Sie einen Thread hab en, der MySQL-Funktionen aufruft,
dieser Thread aber keine Verbindung zur MySQL-Datenbank aufgebaut hat:
Wenn Sie mysql_init() oder mysql_connect() aufrufen, erzeugt MySQL eine Thread-
spezifische Variable f¨ur diesen Thread, die von der Debug-Bibliothek benutzt wird (unter
anderem).
Wenn Sie in einem Thread-Aufruf eine MySQL-Funktion haben, bevor ein Thread mysql_
init() oder mysql_connect() aufgerufen hat, hat der Thread nicht notwendigerweise
Thread-spezifische Variablen zur Hand, und Sie werden wahrscheinlich fr¨uher oder sp¨ater
einen Coredump erhalten.
Damit alles reibungslos funktioniert, m¨ussen Sie folgendes tun:
1. Rufen Sie bei Programmbeginn my_init() auf, wenn Ihr Programm irgend welche
MySQL-Funktion vor dem Aufruf von mysql_real_connect() benutzt.
Comentarios a estos manuales