gpt4 book ai didi

c++ - 如何在 C++ 中使 mysql++ 查询超时

转载 作者:可可西里 更新时间:2023-11-01 06:49:25 25 4
gpt4 key购买 nike

我正在使用 mysql++ 连接到 MySQL 数据库以执行大量数据查询。由于我正在读取的表不断被写入,并且我需要一致的数据 View ,所以我首先锁定了表。然而,MySQL 在它的锁定查询中没有“NOWAIT”的概念,因此如果表被其他东西锁定了很长时间,我的应用程序就会坐在那里等待。我想让它做的是能够返回并说“无法获得锁定”之类的话,然后在几秒钟后重试。我在此超时的一般尝试如下。

如果我在数据库上锁定表后运行它,我会收到超时已命中的消息,但我不知道如何让 mysql_query 行终止。如果有任何帮助/想法,我将不胜感激!


volatile sig_atomic_t success = 1;

void catch_alarm(int sig) {
cout << "Timeout reached" << endl;
success = 0;
signal(sig,catch_alarm);
}

// connect to db etc.
// *SNIP

signal (SIGALRM, catch_alarm);
alarm(2);
mysql_query(p_connection,"LOCK TABLES XYZ as write");

最佳答案

您可以通过这种方式实现“类似取消”的行为:

您在单独的线程上执行查询,无论是否发生超时,该线程都会继续运行。超时发生在主线程上,并将变量设置为“1”以标记它发生。然后你在主线程上做任何你想做的事情。

查询线程,一旦查询完成,检查是否超时。如果没有,它将完成它需要完成的其余工作。如果有,它只是解锁刚刚锁定的表。

我知道这听起来有点浪费,但锁定-解锁周期应该基本上是瞬时的,并且你尽可能接近你想要的结果。

关于c++ - 如何在 C++ 中使 mysql++ 查询超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/81644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com