Ok, encontrei uma solução. Graças a Will e PRR ( meu colega de trabalho ).
Eu não consigo inicie um novo thread em cada consulta, pois este é um aplicativo em tempo real, que deve processar mais de 1.000 mensagens por segundo. (de qualquer forma, graças a R.. para a ideia).
Além disso, não foi possível encerrar a conexão pela biblioteca, nem cancelar/matar a consulta, pois o problema estava no servidor DB.
E aqui está uma solução de força bruta, mas ainda muito melhor que
_EXIT( FAILURE )
:Aqui está a pergunta relacionada:"Como forçar o fechamento socket no Linux?"
- então, acabei de fechar o soquete usando uma chamada de sistema. OBSERVAÇÃO importante :(obrigado Will) - Acontece que nosso wrapper de biblioteca MySQL tem o sinalizador "à prova de falhas", de modo que no soquete fechado (ou outro erro crítico), ele tenta "resolver" o problema, então reabre o soquete , por si só, no meu caso. Então, acabei de desativar esta opção e está tudo bem agora - a execução é encerrada por causa de uma exceção - esta é a maneira "mais suave" de fazer isso.
Isso deve ser feito através de outro thread, é claro - um temporizador, por exemplo.
EDITAR: Os tempos limite estão realmente funcionando para versões após 5.0.25. Mas, pelo menos no RHEL4 e RHEL5, os tempos limite são triplicados por algum motivo! Por exemplo, se alguns dos tempos limite forem definidos para 20 segundos, o tempo limite real será de ~ 60 segundos.
Além disso, outra coisa importante é que esses tempos limite (como qualquer outra opção) DEVE ser definido depois
mysql_init
e antes mysql_connect
ou mysql_real_connect
.