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

时间:2014-04-17 04:32:01

标签: mysql c mysql-connector

我的代码看起来很像这样,只有错误处理(不会被触发)。它在多线程应用程序中调用(每个需要连接的线程一次),在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之后设置_RECONNECT选项,因为它对我来说更可靠。

在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

这似乎没有记录,the relevant page只是说:

  

MYSQL   此结构表示一个数据库连接的句柄。   它几乎用于所有MySQL功能。不要试图做   MYSQL结构的副本。不能保证这样   副本将可用。

"lost connection" help page说:

  

在MySQL 5.0.19之前,即使MYSQL结构中的重新连接标志等于1,

我不认为我曾经看到它实际设置为1,无论我是否使用上面的mysql_options()调用来设置它。有谁知道这意味着什么,以及是否对实际价值有任何意义?

重新连接一段时间后,我一直在追逐一些奇怪的行为,我想知道这是否与它有关(有时自动重新连接失败,但手动断开连接和重新连接工作)。


我已经交换了订单并使用了mysql_options而不是SQL,并且没有对“never 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并不总是设置。

2 个答案:

答案 0 :(得分:1)

根据MySQL的版本,自动重新连接行为略有不同;例如,还有--skip-reconnect选项。 This page解释了它。

希望这有帮助。

答案 1 :(得分:0)

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