Spec-Zone .ru
спецификации, руководства, описания, API
|
Клиентская библиотека почти ориентирована на многопотоковое исполнение. Самая большая проблема состоит в том что
подпрограммы в net.c
то чтение от сокетов не безопасно от прерывания. Это было
сделано с мыслью, что Вы могли бы хотеть иметь свой собственный аварийный сигнал, который может повредить долгое
чтение к серверу. Если Вы устанавливаете обработчиков прерываний для SIGPIPE
прерывание, обработка сокета должна быть ориентирована на многопотоковое исполнение.
Избегать прерывать программу, когда соединение завершается, блоки MySQL SIGPIPE
на
первом звонке mysql_library_init()
,
mysql_init()
,
или mysql_connect()
. Использовать Ваше собственное SIGPIPE
обработчик, сначала вызовите mysql_library_init()
, тогда установите свой обработчик.
Если "неопределенный символ" ошибки происходит,
соединяясь против libmysqlclient
клиентская библиотека, в большинстве случаев это -
то, потому что Вы не включали библиотеки потока по команде ссылки/компиляции.
Клиентская библиотека ориентирована на многопотоковое исполнение для каждого подключения. Можно позволить двум потокам совместно использовать то же самое соединение со следующими протестами:
Многократные потоки не могут отправить запрос серверу MySQL одновременно на том же
самом соединении. В частности следует гарантировать это между звонками mysql_query()
и mysql_store_result()
в одном потоке никакой другой поток не
использует то же самое соединение. У Вас должна быть взаимоисключающая блокировка вокруг Вашей пары mysql_query()
и mysql_store_result()
вызовы. После mysql_store_result()
возвраты, блокировка может быть выпущена, и
другие потоки могут запросить то же самое соединение.
Если Вы используете потоки POSIX, можно использовать pthread_mutex_lock()
и pthread_mutex_unlock()
установить и выпустить взаимоисключающую
блокировку.
Много потоков могут получить доступ к различным наборам результатов, которые
получаются с mysql_store_result()
.
Использовать mysql_use_result()
,
следует гарантировать, что никакой другой поток не использует то же самое соединение, пока набор
результатов не закрывается. Однако, это действительно является лучшим для поточных клиентов, которые
совместно используют то же самое соединение с использованием mysql_store_result()
.
Вы должны знать следующий, если у Вас есть поток, который не создавал соединение с базой данных MySQL, но вызывает функции MySQL:
Когда Вы вызываете mysql_init()
, MySQL создает специфичную для потока переменную для потока, который
используется библиотекой отладки (между прочим). Если Вы вызываете функцию MySQL прежде, чем поток вызвал mysql_init()
, у потока нет необходимых специфичных для потока переменных на
месте, и Вы, вероятно, закончите с дампом ядра рано или поздно. Чтобы избежать проблем, следует сделать
следующее:
Вызвать mysql_library_init()
перед любыми другими функциями MySQL. Это не ориентировано на многопотоковое исполнение, так вызовите
это прежде, чем потоки будут созданы, или защитят вызов со взаимным исключением.
Устроить mysql_thread_init()
быть вызванным рано в обработчике потока прежде, чем вызвать любую функцию MySQL. Если Вы вызываете mysql_init()
, это вызовет mysql_thread_init()
для Вас.
В потоке вызвать mysql_thread_end()
перед вызовом pthread_exit()
. Это освобождает память, используемую MySQL
специфичные для потока переменные.
Предыдущие примечания относительно mysql_init()
также применитесь к mysql_connect()
, который вызывает mysql_init()
.