Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MySQL服务器端超时_C++_Mysql - Fatal编程技术网

C++ MySQL服务器端超时

C++ MySQL服务器端超时,c++,mysql,C++,Mysql,我有一些连接代码,当查询时间过长时会导致超时。连接选项的设置如下(timeout是一个整数): 在测试了上面的超时设置之后,我发现确实发生了抛出,但MySQL继续尝试执行查询。换句话说,下面的try在配置的超时后转到catch,错误代码为2013,但它不会阻止MySQL尝试执行查询(2013是与断开连接相关的错误代码): //其他代码 尝试 { stmt=con->createStatement(); stmt->execute(“如果存在MySQLManagerTest\u TimeoutRe

我有一些连接代码,当查询时间过长时会导致超时。连接选项的设置如下(
timeout
是一个整数):

在测试了上面的超时设置之后,我发现确实发生了抛出,但MySQL继续尝试执行查询。换句话说,下面的
try
在配置的超时后转到
catch
,错误代码为2013,但它不会阻止MySQL尝试执行查询(2013是与断开连接相关的错误代码):

//其他代码
尝试
{
stmt=con->createStatement();
stmt->execute(“如果存在MySQLManagerTest\u TimeoutRead,则删除数据库”);
stmt->execute(“创建数据库MySQLManagerTest\u TimeoutRead”);
stmt->execute(“使用MySQLManagerTest_TimeoutRead”);
stmt->execute(“创建表foo(bar INT)”);
对于(int i=0;i<100;i++)
stmt->execute(“插入foo(bar)值(“+LC(i)+”);
//在循环状态下需要进行一些播放
//使其超过一秒钟,但不要太长
//使用10000似乎需要大约5秒钟
stmt->execute(
“创建函数waitAWhile()”
“返回INT读取SQL数据”
“开始”
“声明baz INT默认值为0;”
“而baz<10000 DO”
“设置baz=baz+1;”
“结束时;”
“返回baz;”
“结束;”
);
res=stmt->executeQuery(“从foo中选择1,其中bar=waitAWhile()”;
}捕获(sql::SQLException&e){

std::cout您可以在常规SQL中通过让SQL Server设置最大查询执行时间来实现这一点。但是,看起来MySQL不支持这一点;有关更多详细信息,请参阅以下答案:

真糟糕。我想“cronjob”选项是合理的(在链接中),谢谢。事实上,现在我想,“cronjob”选项似乎是一个荒谬的黑客行为,但如果没有更好的选项,我想我会尝试一下
sql::ConnectOptionsMap com;
com["hostName"] = url; // Some string
com["userName"] = user; // Some string
com["password"] = pwd; // Some string
com["OPT_RECONNECT"] = true;
com["OPT_READ_TIMEOUT"] = timeout; // Usually 1 (second)
com["OPT_WRITE_TIMEOUT"] = timeout; // Usually 1 (second)
// Other code

try
{
    stmt = con->createStatement();

    stmt->execute("DROP DATABASE IF EXISTS MySQLManagerTest_TimeoutRead");
    stmt->execute("CREATE DATABASE MySQLManagerTest_TimeoutRead");

    stmt->execute("USE MySQLManagerTest_TimeoutRead");
    stmt->execute("CREATE TABLE foo (bar INT)");

    for (int i = 0; i < 100; i++)
        stmt->execute("INSERT INTO foo (bar) VALUES (" + LC(i) + ")");


    // A bit of playing is needed in the loop condition
    // Make it longer than a second but not too long
    // Using 10000 seems to take roughly 5 seconds

    stmt->execute(
        "CREATE FUNCTION waitAWhile() "
            "RETURNS INT READS SQL DATA "
        "BEGIN "
            "DECLARE baz INT DEFAULT 0; "
            "WHILE baz < 10000 DO "
                "SET baz = baz + 1; "
            "END WHILE; "
            "RETURN baz; "
        "END;"
    );

    res = stmt->executeQuery("SELECT 1 FROM foo WHERE bar = waitAWhile()");

} catch (sql::SQLException &e) {
    std::cout << e.getErrorCode() << std::endl;
}

// Other code