我有一段代码,看起来和这个很像,只是加了错误处理(但没有触发)。它在一个多线程应用程序中被调用(每个需要连接的线程调用一次),使用的是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也不总是设置。