Dobře, našel jsem řešení.. Díky Will a PRR (můj spolupracovník).
Nemohu založte nové vlákno na každý dotaz, protože se jedná o aplikaci v reálném čase, která má zpracovat 1000+ zpráv za sekundu..(v každém případě díky R.. za nápad).
Také nebylo možné ukončit spojení přes knihovnu, ani zrušit/ukončit dotaz, protože problém byl v DB serveru..
A zde je řešení hrubou silou, ale stále mnohem lepší než _EXIT( FAILURE )
:Zde je související otázka:"Jak vynutit uzavření socket na Linuxu?"
- Takže jsem právě uzavřel zásuvku pomocí systémového volání.
Důležitá POZNÁMKA :(díky Wille) - Ukázalo se, že náš obal knihovny MySQL má příznak "fail-safe", takže na uzavřeném soketu (nebo jiné kritické chybě) se pokusí "vyřešit" problém, takže soket znovu otevře samo o sobě, v mém případě. Takže jsem právě vypnul tuto možnost a vše je nyní v pořádku - provádění je ukončeno kvůli výjimce - toto je "nejměkčí" způsob, jak to udělat.
To by mělo být samozřejmě provedeno prostřednictvím jiného vlákna - a například časovač.
UPRAVIT: Časové limity skutečně fungují pro verze po 5.0.25. Ale alespoň na RHEL4 a RHEL5 jsou časové limity z nějakého důvodu ztrojnásobeny! Pokud jsou například některé časové limity nastaveny na 20 sekund, skutečný časový limit je ~60 sekund.
Další důležitou věcí je, že tyto časové limity (jako všechny ostatní možnosti) MUSÍ nastavit po mysql_init
a před mysql_connect
nebo mysql_real_connect
.