如何使用C API为MySQL查询设置超时

我知道这里有很多类似的问题,当我谷歌它时,也有很多结果,但它们都没有回答我的问题。 我读了这个 , 这个 , 这个和这个,但它们都不适合我。 我不谈任何锁,我不想使用MySQL c ++连接器,只是C API。

另外,这里非常重要:我在LINUX上这样做。 我为什么提这个? 因为在mysql_options的文档中:

  MYSQL_OPT_READ_TIMEOUT  -  ...此选项仅适用于 
 TCP / IP连接,在MySQL 5.0.25之前,仅适用于Windows。

 MYSQL_OPT_WRITE_TIMEOUT- ...此选项仅适用于 
 TCP / IP连接,在MySQL 5.0.25之前,仅适用于Windows 

那么,有没有办法为5.0.25之前的版本设置查询超时?

我的MySQL版本:

  [root @ xxx kiril] #mysql --version
 mysql Ver 14.12 Distrib 5.0.22,对于使用readline 5.0的redhat-linux-gnu(i686) 

编辑:至少,有没有办法取消查询? 我可以启动一个计时器作为不同的线程,但当它到期..我可以以某种方式取消查询?

好的,我找到了解决方案..感谢WillPRR (我的同事)。

不能在每个查询上启动一个新线程,因为这是一个实时应用程序,应该每秒处理1000多条消息..(无论如何,感谢R ..的想法)。

此外,无法通过库终止连接,也无法取消/终止查询,因为问题出在数据库服务器中。

这是一个蛮力的解决方案,但仍然比_EXIT( FAILURE )好得多:这是相关的问题: “如何在Linux上强制关闭套接字?” – 所以,我刚刚使用系统调用关闭了套接字。

重要说明 :(感谢Will) – 事实certificate,我们的MySQL库包装器具有“故障安全”标志,因此在关闭套接字(或其他严重错误)时,它会尝试“解决”问题,因此重新打开在我的情况下,套接字本身。 所以,我只是关闭了这个选项,现在一切都很好 – 执行因exception而终止 – 这是“最软”的方法。
这应该通过另一个线程完成,当然 – 例如一个计时器。

编辑:超时实际上适用于5.0.25之后的版本。 但是,至少在RHEL4和RHEL5上,由于某种原因,超时时间增加了三倍! 例如,如果某些超时设置为20秒,则实际超时为~60秒。
另外,另一个重要的事情是, 必须 mysql_init 之后mysql_connectmysql_real_connect 之前设置这些超时(与任何其他选项一样)。

我想你可以为C函数调用实现一个超时(如这个线程C ++中所描述的:如何实现任意函数调用的超时? ),但你需要仔细考虑你将离开数据库的状态in – 可能这些仅用于读取数据库,而不是插入/更新。

我从来没有试过这样做,但我一直在阅读,我认为这可能意味着MYSQL_OPT_WRITE_TIMEOUT和MYSQL_OPT_READ_TIMEOUT仅适用于MySQL 5.0.25之前的Windows,但现在可以用于每个TCP / IP连接。 看看这里

问候

编辑:我会尝试将我的mysql服务器更新到更新的版本,并尝试它是否有效。

如果您不介意使用线程,则可以从新线程启动查询,并让主线程为新线程执行短pthread_cond_timedwait ,以设置它进行连接的条件变量。 然后你可以让线程徘徊,直到实际的mysql调用超时。 只要确保它已分离,以便在最终超时时释放资源。 这个解决方案并不漂亮,但至少应该有效。