Доброго времени суток!
Нахожусь в процессе написания утилиты, которая раз в несколько минут в отдельном потоке соединеняется с 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 возвращает признак ошибки. Собственно вопрос: на что можно сориентироваться в такой ситуации? В какую сторону нужно интерпретировать потерянное соединение в течении выполнения запроса? А то непонятно, как определять, прошел благополучно запрос или нет...