La bibliothèque cliente est presque compatible avec les
threads. Le problème le plus important est les routines de
net.c
qui lisent les sockets, et qui ne
sont pas compatibles avec les interruptions. Cela a été fait
en imaginant que vous souhaitiez vos propres alarmes, qui
pourraient interrompre une lecture trop longue. Si vous
installez des gestionnaires d'interruption pour l'alarme
SIGPIPE
, la gestion des sockets devraient
être compatible avec les threads.
Dans les anciennes versions binaires que nous distribuions sur notre site web, (http://www.mysql.com/), les bibliothèques clientes étaient normalement compilées avec l'option de compatibilité avec les threads (les exécutables Windows sont par défaut compatible avec les threads). Les nouvelles distributions binaires doivent disposer des deux bibliothèques, compatibles ou non avec les threads.
Pour obtenir une client threadé où vous pouvez interrompre le
client avec d'autres threads, mettre des délais d'expiration
lors des discussions avec le serveur MySQL, vous devriez
utiliser les bibliothèques -lmysys
,
-lmystrings
et -ldbug
,
ainsi que net_serv.o
que le serveur utilise.
Si vous n'avez pas besoin des interruption ou des expirations,
vous pouvez compiler simplement une bibliothèque compatible
avec les threads, (mysqlclient_r)
et
l'utiliser. See Section 24.2, « API MySQL C ». Dans ce cas, vous n'avez
pas à vous préoccuper du fichier net_serv.o
ou des autres bibliothèques MySQL.
Lorsque vous utiliser un client threadé et que vous souhaitez
utiliser des délais d'expiration et des interruptions, vous
pouvez faire grand usage des routines du fichier
thr_alarm.c
. Si vous utiliser des routines
issues de la bibliothèque mysys
, la seule
chose à penser est de commencer par utiliser
my_init()
! See
Section 24.2.11, « Description des fonctions threadées de C ».
Toutes les fonctions, hormis
mysql_real_connect()
sont compatibles avec
les threads par défaut. Les notes suivantes décrivent comment
compiler une bibliothèque cliente compatible avec les threads.
Les notes ci-dessous, écrites pour
mysql_real_connect()
s'appliquent aussi à
mysql_connect()
, mais comme
mysql_connect()
est obsolète, vous devriez
utiliser mysql_real_connect()
).
Pour rendre mysql_real_connect()
compatible
avec les threads, vous devez recompiler la bibliothèque cliente
avec cette commande :
shell> ./configure --enable-thread-safe-client
Cela va créer une bibliothèque cliente compatible avec les
threads libmysqlclient_r
. Supposons que votre
système d'exploitation dispose d'une fonction
gethostbyname_r()
compatible avec les
threads. Cette bibliothèque est compatible avec les threads
pour chaque connexion. Vous pouvez partager une connexion entre
deux threads, avec les limitations suivantes :
Deux threads ne peuvent pas envoyer de requêtes
simultanées au serveur MySQL, sur la même connexion. En
particulier, vous devez vous assurer qu'entre
mysql_query()
et
mysql_store_result()
, aucun autre thread
n'utilise la même connexion.
De nombreux threads peuvent accéder à différents
résultats qui sont lus avec
mysql_store_result()
.
Si vous utilisez mysql_use_result
, vous
devez vous assurer qu'aucun autre thread n'utilise la même
connexion jusqu'à ce qu'elle soit refermée. Cependant, il
vaut bien mieux pour votre client threadé qu'ils utilisent
mysql_store_result()
.
Si vous voulez utiliser de multiples threads sur la même
connexion, vous devez avoir un verrou mutex autour de vos
fonctions mysql_query()
et
mysql_store_result()
. Une fois que
mysql_store_result()
est prêt, le verrou
peut être libéré et d'autres threads vont pouvoir
utiliser la connexion.
Si vous programmez avec les threads POSIX, vous pouvez
utiliser les fonctions
pthread_mutex_lock()
et
pthread_mutex_unlock()
pour poser et
enlever le verrou mutex.
Vous devez savoir ce qui suit si vous avez un thread qui appel une fonction MySQL qui n,a pas crée de connexion à la base MySQL :
Lorsque vous appelez mysql_init()
ou
mysql_connect()
, MySQL va créer une variable
spécifique au thread qui est utilisée par la libaririe de
débogage (entre autres).
Si vous appelez une fonction MYSQL, avant que le thread n'ai
appelé mysql_init()
ou
mysql_connect()
, le thread ne va pas avoir
les variables spécifiques en place, et vous risquez d'obtenir
un core dump tôt ou tard.
Pour faire fonctionner le tout proprement, vous devez suivre ces étapes :
Appeler my_init()
au début du programme,
si il appelle une autre fonction MySQL, avant d'appeler
mysql_real_connect()
.
Appeler mysql_thread_init()
dans le
gestionnaire de threads avant d'appeler une autre fonction
MySQL.
Dans le thread, appelez
mysql_thread_end()
avant d'appeler
pthread_exit()
. Cela va libérer la
mémoire utiliser par les variables spécifiques MySQL.
Vous pouvez rencontrer des erreurs à cause des symboles non
définis lors du link de votre client avec
libmysqlclient_r
. Dans la plupart des cas,
c'est parce que vous n'avez pas inclus la bibliothèque de
threads dans la ligne de compilation.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.