クライアントラウブラリはスレッドに対して殆ど安全です。最も大きい問題は、ソケットから読み込んだnet.c
中のサブルーチンが割り込みに対して安全でないということです。これは、長い読み取りをブレークすることができる自分自身の警報装置を持ちたいという考えで実施されました。SIGPIPE
中断のために、中断ハンドラーをインストールする場合、ソケットの取り扱いをスレッドに対して安全にすべきです。
接続が終わるとき、プログラムが中断されるのを避けるため、MySQLは、mysql_library_init()
、mysql_init()
またはmysql_connect()
上のSIGPIPE
の最初の呼び出しをブロックします。自分自身のSIGPIPE
ハンドラーを使いたい場合、先ずmysql_library_init()
を呼び出して、それからハンドラーをインストールすべきです。
我々のウェブサイト(http://www.mysql.com/)で配布している古いバイナリー中では、Windowsのためのそれら以外のクライアントライブラリはスレッドに対して安全なオプションを使って通常にコンパイルされません。新しいバイナリーには、通常のライブラリとスレッドに対して安全なライブラリが両方共含まれています。
他のスレッドからクライアントを遮断でき、MySQLサーバーと語るとき、タイムアウトをセットできる、スレッド付きクライアントを取得するため、サーバが使っているnet_serv.o
コードおよび-lmysys
ライブラリ、-lmystrings
ライブラリおよび-ldbug
ライブラリを使うべきです。
中断やタイムアウトが必要でない場合、スレッドに安全なクライアントライブラリ(mysqlclient_r)
を編集して使うことができます。項23.2. 「MySQL C API」を参照してください。この場合、net_serv.o
オブジェクトファイルあるいは他の
MySQLライブラリについて心配する必要はありません。
スレッド付きクライアントを使い、タイムアウトと中断を使いたい時、あなたは
thr_alarm.c
ファイル中にそのルーチンの大いに使用をすることができます。ルーチンをmysys
ライブラリから使っている場合、忘れてはならない唯一つのことは、my_init()
を真っ先にび出すことです。項23.2.11. 「C APIスレッド機能の説明」を参照してください。
全ての場合において、他のMySQL
機能を呼び出す前に、mysql_library_init()
を呼び出すことによって、クライアントライブラリを初期化したか確認してください。ライブラリが必要となったとき、mysql_library_end()
を呼び出してください。
mysql_real_connect()
を除くすべての機能はデフォルトによって、スレッドに対して安全です。次のノートはどのようにスレッドにとって安全なクライアントライブラリをコンパイルして、スレッドにとって安全な方法でそれを使うべきか述べています。(mysql_real_connect()
のための次のノートは、mysql_connect()
が忌避されるので、実際にmysql_connect()
に適用します。)
mysql_real_connect()
をスレッドに対して安全にするため、MySQL
ディストリビューションにこのコマンドを設定しまければなりません。
shell> ./configure --enable-thread-safe-client
その後、配分を編集して、スレッドに安全なクライアントライブラリ、libmysqlclient_r
を生成させてください。(オペレーティング・システムにスレッドに安全なgethostbyname_r()
機能が含まれていると想定します。)このライブラリは接続毎に、スレッドに対して安全になっています。2つのスレッドに、次の警告と使って同じ接続を共有させることができます:
2つのスレッドは同じ接続上で同時にMySQLサーバにクエリーを送ることはできません。mysql_query()
に対する呼び出しとmysql_store_result()
に対する呼び出しの間に、他のスレッドが同じ接続に使われていないか特に確認してください。
多くのスレッドはmysql_store_result()
を使って復元される異なった結果セットにアクセスすることができます。
mysql_use_result
を使う場合、結果セットが閉じられるまで、他のスレッドが同じ接続を使っていないことを確認してください。しかしながら、スレッドクライアントがmysql_store_result()
を使っている同じ接続を共有することは本当に最も良いことです。
同じ接続に複数のスレッドを使いたい場合、mysql_query()
とmysql_store_result()
の呼び出しペアの回にあるりにmutexをロックさせなければなりません。mysql_store_result()
の準備が終わった途端に、ロックを解放することが出来、他のスレッドが同じ接続を尋ねることが許されます。
POSIXスレッドを使う場合、pthread_mutex_lock()
およびpthread_mutex_unlock()
をmutexロックを確立し且つ解放するのに使うことができます。
MySQLデータベースに接続を生成しなかったMySQL機能を呼び出しているスレッドを持っている場合、以下を知る必要があります。
mysql_init()
またはmysql_connect()
を呼び出すとき、MySQLは、(他のものの中から選んだ)デバグライブラリによって使われているスレッドのために、スレッドに固有な変数を生成します。
スレッドがmysql_init()
またはmysql_connect()
呼び出した後、MySQL機能を呼び出す場合、スレッドには必要なスレッドに固有な変数を定位置に含んでいないので、遅かれ早かれコアダンプになる可能性があります。
順調に働かせるものを手に入れるため、あなたは次のことをしなければなりません:
それが他のMySQL機能でも呼び出す場合、mysql_real_connect()
を呼び出す前のプログラムの立ち上げで、my_init()
を呼び出してください。
MySQL機能を呼び出す前に、スレッドハンドラーの中に、mysql_thread_init()
を呼び出してください。
mysql_thread_end()
を呼び出す前に、スレッドの中にpthread_exit()
を呼び出してください。これはMySQLスレッドに固有な変数によって使われたメモリを解放します。
クライアントを「undefined
symbol」とリンクするとき、libmysqlclient_r
エラーが発生した場合、殆どの場合これは、リンク/コンパイルコマンド上にスレッドライブラリを含めなかったことに起因して発生します。