我知道这里有很多类似的问题,当我谷歌时它也有很多结果,但没有一个能回答我的问题。我看过this,this,this和this,但这些都不适合我。我不谈任何锁,我不想使用MySQL c ++连接器,只是C API。
此外,这里非常重要:我在LINUX上执行此操作。我为什么提这个?因为在mysql_options的文档中:
MYSQL_OPT_READ_TIMEOUT - ...This option works only for TCP/IP connections and, prior to MySQL 5.0.25, only for Windows. MYSQL_OPT_WRITE_TIMEOUT- ... This option works only for TCP/IP connections and, prior to MySQL 5.0.25, only for Windows
那么,有没有办法为5.0.25之前的版本设置查询超时?
我的MySQL版本:
[root@xxx kiril]# mysql --version mysql Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i686) using readline 5.0
编辑:至少,有没有办法取消查询?我可以将计时器作为不同的线程启动,但是当它到期时......我可以以某种方式取消查询吗?
答案 0 :(得分:2)
好的,我找到了一个解决方案..感谢Will和 PRR (我的同事)。
我无法在每个查询上启动一个新线程,因为这是一个实时应用程序,应该每秒处理1000多条消息..(无论如何,感谢{{3}为了这个想法)。
此外,无法通过库终止连接,也无法取消/终止查询,因为问题出在数据库服务器中。
这是一个蛮力的解决方案,但仍然比_EXIT( FAILURE )
好得多:这是相关的问题:R.. - 所以,我刚刚使用系统调用关闭套接字。
重要提示 :(谢谢Will) - 事实证明,我们的MySQL库包装器有“故障安全”标志,所以在关闭的套接字(或其他严重错误)上,它会尝试“解决”问题,所以它在我的情况下重新打开套接字本身。所以,我只是关闭了这个选项,现在一切都很好 - 执行因异常而终止 - 这是“最软”的方式。
这应该通过另一个线程来完成,当然 - 例如一个计时器。
编辑:超时确实适用于5.0.25之后的版本。但是,至少在RHEL4和RHEL5上,由于某种原因,超时时间增加了三倍!例如,如果某些超时设置为20秒,则实际超时为~60秒
此外,另一个重要的事情是,这些超时(与任何其他选项一样)必须在 mysql_init
和之前设置 {{ 1}}或mysql_connect
。
答案 1 :(得分:1)
我想你可以为C函数调用实现一个超时(如这个帖子C++: How to implement a timeout for an arbitrary function call?中所描述的那样),但是你需要仔细考虑你将DB保留在什么样的状态 - 可能这些是仅用于读取数据库,而不是插入/更新。
答案 2 :(得分:0)
我从未尝试过这样做,但我一直在阅读,我认为这可能意味着MYSQL_OPT_WRITE_TIMEOUT和MYSQL_OPT_READ_TIMEOUT仅适用于MySQL版本5.0.25之前的Windows,但现在可以用于每个TCP / IP连接。拿一个look here
此致
编辑:我会尝试将我的mysql服务器更新到更新的版本并尝试它是否有效。
答案 3 :(得分:0)
如果您不介意使用线程,则可以从新线程启动查询,并让主线程为新线程执行短pthread_cond_timedwait
以设置它建立连接的条件变量。然后你可以让线程徘徊,直到实际的mysql调用超时。只需确保它已分离,以便在最终超时时释放其资源。这个解决方案并不漂亮,但它至少应该有效。