LINUX.ORG.RU

mysql c api в многопоточной программе


0

0

Доброго времени суток!

Нахожусь в процессе написания утилиты, которая раз в несколько минут в отдельном потоке соединеняется с mysql сервером, выполняет запрос и отсоединяется от сервера (дескриптор соединения создаётся и уничтожается на стеке функции потока), т. е. «пересечений» между дескрипторами соединения с mysql нету.

Пишу под CentOS (2.6.18-53.el5), использую posix threads, собираю с -lmysql_client_r, mysql_thread_safe честно возвращает единицу.

Подключение проходит куда менее на ура, чем если делать в однопоточном режиме - хотя бы то, что блокирующий mysql_real_connect часто не срабатывает (т.е. возвращает NULL), при этом

mysql_error: Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (4)

mysql_errno: 2003 (CR_CONN_HOST_ERROR)

errno: 4

perror 4: OS error code 4: Interrupted system call

Это вроде объяснимо тем, что pthreads работает через сигналы, при этом не ставя SA_RESTART.

1) Поделитесь плиз, у кого есть соображения - почему mysql_real_connect иногда возвращает NULL, при этом:

mysql_error: Lost connection to MySQL server at 'reading authorization packet, system error: 0'

mysql_errno: 2013 (CR_SERVER_LOST)

errno: 0

- это все при том, что mysql сервер работает, не падает и при следующей попытке подключение успешно происходит?

Это лишь в дополнительных потоках, когда произвожу соединение из основного потока все идет четко и ничего не прерывается.

В однопоточном режиме таких сложностей как-то не возникало, во-всяком случае мне не попадались, даже если ставил обработчики на некоторые сигналы.

2) Вызовы mysql_options (с параметрами MYSQL_OPT_LOCAL_INFILE и MYSQL_OPT_CONNECT_TIMEOUT) могут длится несколько секунд (опять же в отличие от однопоточного режима) - за счет чего?

3) После успешной установки соединения делаю запрос load data local infile. Иногда mysql_query возвращает «nonzero», при этом

mysql_error: Lost connection to MySQL server during query mysql_errno: 2013 (CR_SERVER_LOST) errno: 0

Однако несмотря на возвращаемое значение, mysql_error,mysql_errno - запрос успешно выполнился! Но функция mysql_query возвращает признак ошибки. Собственно вопрос: на что можно сориентироваться в такой ситуации? В какую сторону нужно интерпретировать потерянное соединение в течении выполнения запроса? А то непонятно, как определять, прошел благополучно запрос или нет...



Последнее исправление: deadka (всего исправлений: 1)

Ответ на: комментарий от Sorcerer

Да, косвенно - вызываю mysql_init, она вызывает my_init, а та вызывает mysql_thread_init

deadka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.