mysql创建线程安全客户端

资料出处:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#threaded-clients
25.2.13.4. 与C API有关的问题
与C API链接时,在某些系统上可能出现下述错误:
gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnsl
 
Undefined        first referenced
 symbol          in file
floor            /usr/local/lib/mysql/libmysqlclient.a(password.o)
ld: fatal: Symbol referencing errors. No output written to client
如果在你的系统上出现了该情况,必须在编译/链接行的末尾增加“-lm”,通过该方式包含数学库。


25.2.14. 创建客户端程序
如果你编译了自己编写的MySQL客户端,或编译了从第三方获取的MySQL客户端,必须在链接命令中使用“-lmysqlclient -lz”选项链接它们。你或许还应指定“-L”选项,
通知链接程序到哪里找到库。例如,如果将库安装到了/usr/local/mysql/lib,可在链接命令中使用sr/local/mysql/lib -lmysqlclient –lz。
对于使用MySQL头文件的客户端,编译它们时还须指定“-I”选项(例如,-I/usr/local/mysql/include),以便编译器能找到头文件。
为了使在Unix平台上编译MySQL程序变得简单,提供了mysql_config脚本。请参见25.9.2节,“mysql_config:获取编译客户端的编译选项”。


你也可以使用它来编译MySQL客户端,如下所述:
CFG=/usr/local/mysql/bin/mysql_config
sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"
需要使用“sh –c”,使得shell不将mysql_config的输出当作1个词对待。


25.2.15. 如何生成线程式客户端
客户端库总是线程安全的。最大的问题在于从套接字读取的net.c中的子程序并不是中断安全的。或许你可能希望用自己的告警中断对服务器的长时间读取,以此来解决问题。
如果为SIGPIPE中断安装了中断处理程序,套接字处理功能应是线程安全的。
为了避免连接中断时放弃程序,MySQL将在首次调用mysql_server_init()、mysql_init()或mysql_connect()时屏蔽SIGPIPE。如果你打算使用自己的SIGPIPE处理程序,首先应
调用mysql_server_init(),然后安装你的处理程序,
在较旧的发布在我方网站上(http://www.mysql.com/)的二进制版本中,未用线程安全的选项对客户端库进行正常编译(默认情况下,编译的Windows二进制版本是线程安全的)
。较新的二进制分发版应是正常的和线程安全的客户端库。
为了获得能从其他线程中断客户端的线程式客户端,并在与MySQL服务器通信时设置超时,应使用“-lmysys”、“-lmystrings”和“-ldbug”库,以及服务器使用的net_serv.o代码。
如果你不需要使用中断或超时,可编译线程安全客户端库(mysqlclient_r)并使用它。。请参见25.2节,“MySQL C API”。在该情况下,不必担心net_serv.o对象文件或其他MySQL库。
使用线程式客户端并打算使用超时或中断时,可更好地利用thr_alarm.c文件中的子程序。如果你正在使用来自mysys库的子程序,唯一需要记住的事是首先调用my_init()!请参见
25.2.11节,“C API线程函数介绍”。


对于除mysql_real_connect()外的所有函数,在默认情况下它们均是线程安全的。在下面的说明中,介绍了编译线程安全客户端库的方法,以及以线程安全方式使用它的方法。(下面
关于mysql_real_connect()的说明实际上也适用于mysql_connect(),但由于mysql_connect()已不再被重视,总应尽量使用mysql_real_connect())。
要想使mysql_real_connect()成为线程安全的,必须用下述命令再次编译客户端库:
shell> ./configure --enable-thread-safe-client
它创建了线程安全客户端库libmysqlclient_r。(假定你的操作系统有线程安全的gethostbyname_r()函数)。按照连接,该库是线程安全的。可遵循下述警告,使两个线程共享相同的连接:
·         在相同的连接上,两个线程不能同时将查询发送到MySQL服务器。尤其是,必须确保在mysql_query()和mysql_store_result()之间,没有使用相同连接的其他线程。
·         很多线程均能访问由mysql_store_result()检索的不同结果集。
·         如果使用了mysql_use_result,务必确保无其他线程正在使用相同的连接,直至关闭了结果集为止。然而,对于线程式客户端,最好是共享相同的连接以使用mysql_store_result()。
·         如果打算在相同的连接上使用多个线程,必须在mysql_query()和mysql_store_result()调用组合上拥有互斥锁。一旦mysql_store_result()准备就绪,可释放锁定,其他线程可在
相同的连接上执行查询。
·         如果使用POSIX线程进行编程,可使用pthread_mutex_lock()和pthread_mutex_unlock()来建立并释放互斥锁。
如果你有1个调用MySQL函数的线程,而该函数未创建与MySQL数据库的连接,就需了解下述事宜:
调用mysql_init()或mysql_connect()时,MySQL会为调试库使用的线程创建与线程相关的变量(尤其)。
在线程调用mysql_init()或mysql_connect()之前,如果调用了MySQL函数,该线程将没有所需的线程类变量,而且你很可能或早或晚结束于内核转储。
要想使这些操作平稳工作,需要采取下述措施:
1.    如果程序在调用mysql_real_connect()之前需要调用任何其他MySQL函数,请在启动程序时调用my_init()。
2.    调用任何MySQL函数之前,在线程处理程序中调用mysql_thread_init()。
3.    在线程中,调用pthread_exit()之前请调用mysql_thread_end()。这样,就能释放MySQL线程类变量使用的内存。
将客户端链接到libmysqlclient_r时,如果存在未定义的符号,可能会出错。在大多数情况下,其原因在于,未将线程库包含在link/compile行上。

你可能感兴趣的:(thread,mysql,api,server,服务器,query)