MySQL重新连接标志位的值是什么意思?

4

我有一段代码,看起来和这个很像,只是加了错误处理(但没有触发)。它在一个多线程应用程序中被调用(每个需要连接的线程调用一次),使用的是Ubuntu 13.10.1上的MySQL 5.5.37-0:

DBConnection = mysql_init(NULL);
mysql_options((MYSQL *) DBConnection, MYSQL_SET_CHARSET_NAME, "utf8");
mysql_real_connect(DBConnection, ...);
my_bool reconnect = true;
mysql_options(DBConnection, MYSQL_OPT_RECONNECT, &reconnect);
mysql_query(DBConnection, "SET wait_timeout=60"); //!!!
printf("reconnect flag %d", DBConnection->reconnect);

我已经将断开超时时间大幅缩短,以便测试重新连接代码(1分钟而不是默认的8小时)。编辑:在this page之后,我会设置_real_connect选项,因为它对我来说更加可靠。
在mysql.h中,相关代码如下:
my_bool reconnect;  /* set to 1 if automatic reconnect */

那个“重新连接”的字段的值似乎是随机的。从上面的日志中获取值,我看到:100、104、106、108、108、38、43、56、59、63、64、88、92、98。
这似乎没有记录在文档中。相关页面只是说:
MYSQL 此结构表示对一个数据库连接的句柄。 它用于几乎所有MySQL函数。不要试图制作MYSQL结构的副本。无法保证这样的复制品可用。 “连接丢失”帮助页面说:
在MySQL 5.0.19之前,即使MYSQL结构中的重新连接标志等于1,

我认为我从来没有看到它被实际设置为1,无论我是否使用上面的mysql_options()调用进行设置。有人知道这意味着什么,以及实际值是否有任何重要意义吗?

我已经追踪了一段时间的重新连接后略微奇怪的行为,我想知道这是否可能与此有关(有时自动重新连接失败,但手动断开连接和重新连接可以解决问题)。


我已经交换了顺序,并使用了mysql_options而不是SQL,但对于“从未为0或1”的结果没有明显的变化。新代码:

DBConnection = mysql_init(NULL);
mysql_options((MYSQL *) DBConnection, MYSQL_SET_CHARSET_NAME, "utf8");
my_bool reconnect = true;
mysql_options(DBConnection, MYSQL_OPT_RECONNECT, &reconnect);
mysql_options(DBConnection, MYSQL_OPT_CONNECT_TIMEOUT, "60");
mysql_real_connect(DBConnection, ...);
printf("reconnect flag %d", DBConnection->reconnect);

相同的结果,但是你的确切值可能会有所不同(我的下面的评论使用了不同的运行并得到了不同的值)。使用30个线程启动我的代码,我得到了:101, 101, 101, 106, 109, 112, 112, 115, 117, 118, 120, 123, 47, 56, 56, 59, 62, 68, 80, 81, 81, 88, 88, 88, 90, 91, 91, 92, 93, 94, 96(从日志文件中轻松获取这些的方法涉及对其进行排序,因此顺序与最初的顺序不同)。主要问题是它不是手册上应该是的“1”。位0也不总是设置。

就此而言,MariaDB始终返回1或0,我们因其他原因已经切换到它了。 - Code Abominator
2018年,该值不再在公共接口中可见。显然,他们也不知道它的含义 :) - Code Abominator
2个回答

1
根据MySQL的版本,自动重连行为略有不同;例如,还有--skip-reconnect选项。此页面进行了解释。
希望这可以帮到你。

很抱歉,但我在那个页面上没有看到任何描述重新连接标志值含义的内容。你能否扩展你的答案并引用相关部分? - Code Abominator
抱歉 @DigiTester,我没有仔细阅读你的问题。我也找不到为什么会分配你注意到的随机值的方式/原因;但是由于 reconnect 用作布尔值,所有非零值都会计算为 TRUE。 - Armon
顺便问一句,你正在使用哪个版本? - Armon
抱歉,我应该包含这个信息:5.5.37-0ubuntu0.13.10.1。我知道布尔值是有效的,我的代码似乎也能正常工作,但我正在寻找它表现为什么会这样(也许解决潜在问题)。 - Code Abominator
尝试使用mysql_options设置超时时间,而不是在查询中设置;例如:mysql_options(DBConnection, MYSQL_OPT_CONNECT_TIMEOUT, "60")。此外,在所有mysql_options()调用之后应该调用mysql_real_connect() - Armon
但我刚刚启动了30个线程,使用mysql_options调用,都在real_connect之前,结果相同:101、101、102、106、115、119、121、121、37、40、44、46、48、56、57、59、60、63、66、70、73、73、76、86、86、89、90、91、93、96、97。 - Code Abominator

0
要连接到服务器,请调用mysql_init()来初始化连接处理程序,然后使用该处理程序(以及其他信息,如主机名、用户名和密码)调用“mysql_real_connect()”。连接成功后,mysql_real_connect()会在API版本早于5.0.3的情况下将重新连接标志设置为1,或在新版本中设置为0。此标志的值为1表示,如果由于连接丢失而无法执行语句,则在放弃之前尝试重新连接到服务器。

我的问题明确表示我没有看到0或1作为重新连接标志值。它还链接到您引用的手册页面,给出的代码示例包括您建议的调用。 - Code Abominator
你能详细说明你的问题吗,这样我才能用你的方式回答吗? - user3106065

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接