Хорошо, я нашел решение .. Спасибо Будет и PRR (мой сотрудник).
Я не могу запускать новый поток для каждого запроса, так как это приложение реального времени, которое должно обрабатывать более 1000 сообщений в секунду .. (в любом случае, благодаря R .. за идею).
Кроме того, не было возможности ни разорвать соединение через библиотеку, ни отменить / уничтожить запрос, поскольку проблема была в сервере БД.
А вот и грубое решение, но все же гораздо лучше, чем _EXIT( FAILURE )
: Вот связанный с этим вопрос: «Как принудительно закрыть сокет в Linux?» - так что я просто закрыл сокет, используя системный вызов.
Важное примечание : (спасибо Will) - Оказалось, что наша оболочка библиотеки MySQL имеет флаг "fail-safe", поэтому на закрытом сокете (или другой критической ошибке) она пытается «решить» проблему, поэтому она сама открывает сокет в моем случае. Итак, я просто отключил эту опцию, и теперь все в порядке - выполнение прекращается из-за исключения - это самый "мягкий" способ сделать это.
Конечно, это должно быть сделано через другой поток - например, по таймеру.
РЕДАКТИРОВАТЬ: Тайм-ауты действительно работают для версий после 5.0.25. Но, по крайней мере на RHEL4 и RHEL5, таймауты по некоторым причинам утроены! Например, если для некоторых тайм-аутов установлено значение 20 с, реальное время ожидания составляет ~ 60 с.
Кроме того, еще одним важным моментом является то, что эти таймауты (как и любые другие параметры) ДОЛЖНЫ быть установлены после mysql_init
и до mysql_connect
или mysql_real_connect
,