代码之家  ›  专栏  ›  技术社区  ›  Kiril Kirov

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

  •  8
  • Kiril Kirov  · 技术社区  · 14 年前

    我知道这里有很多类似的问题,也有很多结果,当我谷歌它,但没有一个回答我的问题。我读过 this , this , this this 但他们都不适合我。我不讨论任何锁,我不想使用MySQL c++连接器,只使用c API。

    另外,这里非常重要的是:我在LINUX上做这个。我为什么这么说?因为在mysql_选项的文档中:

    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

    编辑: 至少,有什么方法可以取消查询吗?我可以用不同的线程启动计时器,但当它过期时。。我可以取消查询吗?

    4 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    7 年前

    好吧,我找到了解决办法。。多亏了 Will PRR公司 (我的同事)。

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

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

    这里有一个暴力的解决方案,但更好的是 _EXIT( FAILURE ) :以下是相关问题: "How to force closing socket on Linux?" -所以,我刚用系统调用关闭了套接字。

    重要提示 :(感谢Will)-结果是,我们的MySQL库包装器有一个“fail-safe”标志,因此在关闭套接字(或其他严重错误)时,它会尝试“解决”问题,因此它会自行重新打开套接字,就我的情况而言。所以,我刚刚关闭了这个选项,现在一切都好了——执行因为一个异常而终止——这是最“软”的方法。
    当然,这应该通过另一个线程来完成,例如计时器。

    编辑: 对于5.0.25之后的版本,超时确实有效。但是,至少在RHEL4和RHEL5上,由于某种原因,超时次数增加了三倍!例如,如果某些超时设置为20秒,则实际超时为~60秒。。
    另外,另一个重要的事情是,这些超时(和其他选项一样) 必须 准备好 之后 mysql_init 之前 mysql_connect mysql_real_connect .

        2
  •  1
  •   Community CDub    7 年前

    我想您可以实现C函数调用的超时(如本线程所述 C++: How to implement a timeout for an arbitrary function call? ),但您需要仔细考虑将数据库保留在什么样的状态中—可能这些状态只是用于读取数据库,而不是插入/更新。

        3
  •  0
  •   SubniC    14 年前

    我从来没有尝试过这样做,但我一直在阅读,我认为这可能意味着MYSQL_OPT_WRITE_TIMEOUT和MYSQL_OPT_READ_TIMEOUT只适用于windows 5.0.25之前的MYSQL版本,但现在应该适用于每个TCP/IP连接。拿一个 look here

    当做

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

        4
  •  0
  •   R.. GitHub STOP HELPING ICE    14 年前

    如果您不介意使用线程,可以从一个新线程开始查询,并让主线程执行一个简短的 pthread_cond_timedwait 让新线程设置一个条件变量来建立连接。然后,您可以让线程徘徊直到实际的mysql调用超时。只需确保它是分离的,这样当它最终超时时,它的资源就会被释放。这个解决方案不太好,但至少应该可行。