Services webmasters
Partenaires
Jeux concours gratuits
 
Compiler les clients
<<<
Comment faire un client MySQL threadé libmysqld, la librairie du serveur embarqué MySQL
>>>

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.

<< Comment faire un client MySQL threadé >>
Compiler les clients Interface C pour MySQL libmysqld, la librairie du serveur embarqué MySQL
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -