当您尝试向服务器发送要执行的语句时,如果 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()
来终止它。