8.4 Interface C pour MySQL
8 Les interfaces pour MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Types de données de l'API C . Vue d'ensemble des fonctions de l'API C . Description des fonctions de l'API C . Description des fonctions threadées de C . Description des fonctions C du serveur embarqué . Questions courantes sur la librairie C . Compiler les clients ->Comment faire un client MySQL threadé . libmysqld, la librairie du serveur embarqué MySQL
|
8.4.8 Comment faire un client MySQL threadé
La librairie 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 librairies 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 librairies, 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 librairies
-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 librairie compatible avec les threads,
(mysqlclient_r)
et l'utiliser. API C pour MySQL . Dans ce cas,
vous n'avez pas à vous préoccuper du fichier
net_serv.o
ou des
autres librairies 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 librairie
mysys
, la seule chose à penser est de commencer
par utiliser
my_init()
! Fonctions de threads C .
Toutes les fonctions, hormis
mysql_real_connect()
sont compatibles avec
les threads par défaut. Les notes suivantes décrivent comment compiler une librairie
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 librairie cliente avec cette commande :
shell> ./configure --enable-thread-safe-client
|
Cela va créer une librairie 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 librairie 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 librairie de thread dans la ligne de compilation.
|