Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como definir um tempo limite para consulta MySQL usando a API C


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 .