2010-11-23 100 views
8

我知道这里有很多类似的问题,当我谷歌的时候也有很多结果,但是他们都没有回答我的问题。我读了this,this,thisthis但他们没有一个适合我。我不会谈论任何锁,我不想使用MySQL C++连接器,只是C API。如何使用C API为MySQL查询设置超时

另外,这里有什么非常重要的:我在LINUX上这样做。为什么我提到这个?

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_options文档中?

我的MySQL版本:

[[email protected] kiril]# mysql --version 
mysql Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i686) using readline 5.0

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

+0

你使用的是什么MySQL版本? – SubniC 2010-11-23 09:05:59

+1

@Kiril Kirov - 你可以在mysql中使用kill命令杀死一个正在运行的查询 - http://dev.mysql.com/doc/refman/5.0/en/kill.html – ajreal 2010-11-25 11:05:01

+0

@ajreal - 谢谢!我会尝试 – 2010-11-25 11:40:48

回答

2

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

不能开始每个查询一个新的线程,因为这是一个实时的应用程序,这应该是每秒的消息..处理1000+(反正,感谢R..的想法)。

而且,这是不可能的,终止通过磁带库的连接,也没有取消/杀查询,因为这个问题是在DB服务器..

而这里的蛮力解决方案,但仍好得多_EXIT(FAILURE):这里是相关的问题:"How to force closing socket on Linux?" - 所以,我刚刚关闭套接字使用系统调用。结果证明,我们的MySQL库包装器具有“故障安全”标志,因此在封闭套接字(或其他严重错误)上,它试图“解决”这个问题,所以它重新打开套接字,本身就是我的情况。所以,我刚刚关闭了这个选项,现在一切正常 - 由于例外导致执行终止 - 这是做到这一点的“最软”的方式。
这应该通过另一个线程来完成,当然是一个计时器,例如。

编辑:超时实际上适用于5.0.25以后的版本。但是,至少在RHEL4和RHEL5上,由于某种原因,超时会增加三倍!
此外,另一个重要的一点是,这些超时(如任何其他选项)MUST设置后例如,如果一些超时设置为20秒,真正的超时时间为60秒〜..mysql_init之前mysql_connectmysql_real_connect

0

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

问候

编辑:我想尝试我的MySQL服务器更新到新版本,并尝试,如果它的工作原理。

0

如果您不介意使用线程,则可以从新线程启动查询并让主线程为新线程执行一个简短的pthread_cond_timedwait以设置它创建连接的条件变量。然后你可以让线程逗留直到实际的mysql调用超时。只要确保它是分离的,以便在它最终超时时它的资源就会被释放。这个解决方案并不美观,但至少应该起作用。