Compiler les clients
<<<
Comment faire un client MySQL threadé libmysqld , la bibliothèque du serveur embarqué MySQL
>>>

21.2 API MySQL C
21 API 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
Fonctions C de commandes préparées
Types de données de l'API C
Présentation des fonctions de l'interface C
Descriptions des fonctions C pour les requêtes préparées
Gestion des commandes multiples avec l'interface C
Gestion des dates et horaires avec l'interface C
Description des fonctions threadées de C
Description des fonctions C du serveur embarqué
Questions courantes sur la bibliothèque C
Compiler les clients
->Comment faire un client MySQL threadé
libmysqld , la bibliothèque du serveur embarqué MySQL

21.2.14 Comment faire un client MySQL threadé

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. Interface 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() ! Description des fonctions thréadées en 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.

<< Comment faire un client MySQL threadé >>
Compiler les clients API MySQL C libmysqld , la bibliothèque du serveur embarqué MySQL