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