Dobra, znalazłem rozwiązanie.. Dzięki Will i PRR (mój współpracownik).
nie mogę uruchom nowy wątek przy każdym zapytaniu, ponieważ jest to aplikacja działająca w czasie rzeczywistym, która ma przetwarzać ponad 1000 wiadomości na sekundę..(w każdym razie dzięki R.. za pomysł).
Nie było również możliwości przerwania połączenia przez bibliotekę ani anulowania/zabicia zapytania, ponieważ problem dotyczył serwera DB.
A oto rozwiązanie siłowe, ale wciąż znacznie lepsze niż _EXIT( FAILURE )
:Oto powiązane pytanie:"Jak wymusić zamknięcie gniazdo w Linuksie?"
- więc właśnie zamknąłem gniazdo za pomocą wywołania systemowego.
Ważna UWAGA :(dzięki Will) - Okazało się, że nasz wrapper biblioteki MySQL posiada flagę "fail-safe", więc przy zamkniętym gnieździe (lub innym krytycznym błędzie) próbuje "rozwiązać" problem, więc ponownie otwiera gniazdo , w moim przypadku. Tak więc po prostu wyłączyłem tę opcję i wszystko jest teraz w porządku - wykonanie zostało przerwane z powodu wyjątku - jest to "najdelikatniejszy" sposób na zrobienie tego.
Powinno to być zrobione przez inny wątek, oczywiście - a na przykład timer.
EDYTUJ: Limity czasu naprawdę działają dla wersji po 5.0.25. Ale przynajmniej w RHEL4 i RHEL5 limity czasu są z jakiegoś powodu potrojone! Na przykład, jeśli niektóre limity czasu są ustawione na 20 sekund, rzeczywisty limit czasu wynosi ~60 sekund.
Ponadto inną ważną rzeczą jest to, że te limity czasu (jak wszystkie inne opcje) MUSZĄ być ustawiony po mysql_init
i przed mysql_connect
lub mysql_real_connect
.