3.6.8 自动重连控制

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

注意

自动重连功能已被弃用。相关的 MYSQL_OPT_RECONNECT 选项仍然可用,但现在如果您的应用程序使用该选项调用 mysql_get_option()mysql_options() 函数,即使将其设置为 false,它也会向标准错误输出返回弃用警告。

预计在未来版本的 MySQL 中将删除自动重连功能。

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

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

某些客户端程序可能提供控制自动重连的功能。例如,mysql 默认情况下会重新连接,但可以使用 --skip-reconnect 选项来抑制此行为。

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

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

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

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

  • 释放所有表锁。

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

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

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

  • 释放预处理语句。

  • 关闭 HANDLER 变量。

  • LAST_INSERT_ID() 的值重置为 0。

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

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

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

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