如果 MySQL 客户端库在您尝试向服务器发送要执行的语句时发现连接已断开,则它可以执行与服务器的自动重新连接。如果启用了自动重新连接,库会尝试一次重新连接到服务器并再次发送语句。
默认情况下禁用自动重新连接。
如果您的应用程序知道连接已断开(以便它可以退出或采取措施调整状态信息的丢失)很重要,请确保禁用自动重新连接。为确保这一点,请
mysql_options()
使用以下
MYSQL_OPT_RECONNECT
选项调用:
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()
.