3.6.6 自动重连控制

如果 MySQL 客户端库在您尝试向服务器发送要执行的语句时发现连接已断开,则它可以执行与服务器的自动重新连接。如果启用了自动重新连接,库会尝试一次重新连接到服务器并再次发送语句。

默认情况下禁用自动重新连接。

如果您的应用程序知道连接已断开(以便它可以退出或采取措施调整状态信息的丢失)很重要,请确保禁用自动重新连接。为确保这一点,请 mysql_options()使用以下 MYSQL_OPT_RECONNECT选项调用:

my_bool reconnect = 0;
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);

如果连接断开,效果 mysql_ping()取决于自动重新连接状态。如果启用了自动重新连接,则 mysql_ping()执行重新连接。否则,它返回一个错误。

一些客户端程序可能提供控制自动重新连接的能力。例如,mysql 默认会重新连接,但 --skip-reconnect 可以使用该选项来抑制这种行为。

如果确实发生自动重新连接(例如,由于调用mysql_ping()),则没有明确指示。要检查重新连接,请 mysql_thread_id()在调用之前调用以获取原始连接标识符 mysql_ping(),然后 mysql_thread_id()再次调用以查看标识符是否已更改。

自动重新连接可能很方便,因为您不需要实现自己的重新连接代码,但如果确实发生了重新连接,连接状态的几个方面将在服务器端重置,您的应用程序将不会收到通知。

重连对连接相关状态的影响如下:

  • 回滚任何活动事务并重置自动提交模式。

  • 释放所有表锁。

  • 关闭(并删除)所有TEMPORARY表。

  • 将会话系统变量重新初始化为相应全局系统变量的值,包括由语句隐式设置的系统变量,例如 SET NAMES.

  • 丢失用户定义的变量设置。

  • 发布准备好的语句。

  • 关闭HANDLER变量。

  • 将 的值重置 LAST_INSERT_ID()为 0。

  • 释放使用 获取的锁 GET_LOCK()

  • 失去客户端与threads确定连接线程检测的 Performance Schema 表行的关联。如果客户端在断开连接后重新连接,则会话与表中的新行相关联,threads 并且线程监视状态可能不同。请参阅 线程表

如果发生重新连接,则重新执行 通过mysql_options()使用该 选项 调用指定的任何 SQL 语句 。MYSQL_INIT_COMMAND

如果连接断开,如果服务器尚未检测到客户端不再连接,则与服务器端连接关联的会话可能仍在运行。在这种情况下,原始连接持有的任何锁仍属于该会话,因此您可能希望通过调用mysql_kill().