27.7.19 C API 自动重新连接控制
当您尝试向服务器发送要执行的语句时,MySQLClient 端库发现连接断开,则 MySQLClient 端库可以执行与服务器的自动重新连接。如果启用了自动重新连接,则库将尝试一次重新连接到服务器,然后再次发送该语句。
默认情况下,自动重新连接处于禁用状态。
如果对您的应用程序来说重要的是要知道已断开连接(以便它可以退出或采取措施来调整状态信息的丢失),请确保已禁用自动重新连接。为此,请使用MYSQL_OPT_RECONNECT
选项致电mysql_options():
my_bool reconnect = 0;
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);
如果连接断开,则mysql_ping()的效果取决于自动重新连接状态。如果启用了自动重新连接,则mysql_ping()执行重新连接。否则,它将返回错误。
某些 Client 端程序可能提供控制自动重新连接的功能。例如,默认情况下mysql重新连接,但是--skip-reconnect选项可用于抑制此行为。
如果确实发生了自动重新连接(例如,由于调用mysql_ping()),则没有明确的指示。要检查是否重新连接,请先调用mysql_thread_id()以获取原始连接标识符,然后再调用mysql_ping(),然后再次调用mysql_thread_id()以查看标识符是否已更改。
自动重新连接很方便,因为您不需要实现自己的重新连接代码,但是如果确实发生了重新连接,则在服务器端会重置连接状态的多个方面,并且不会通知您的应用程序。
与连接有关的状态受到以下影响:
-
回滚所有活动的事务,并重置自动提交模式。
-
所有 table 锁均已释放。
-
所有
TEMPORARY
table 均已关闭(并删除)。 -
会话系统变量将重新初始化为相应的全局系统变量的值,包括由诸如SET NAMES之类的语句隐式设置的系统变量。
-
用户变量设置丢失。
-
准备好的语句被释放。
-
HANDLER个变量已关闭。
-
LAST_INSERT_ID()的值重置为 0.
-
用GET_LOCK()获取的锁被释放。
-
Client 端与确定连接线程检测的 Performance Schema threadstable 行之间的关联丢失。如果 Client 端在断开连接后重新连接,则该会话与threadstable 中的新行关联,并且线程监视状态可能不同。参见第 25.12.16.3 节“线程 table”。
如果发生重新连接,则将重新执行通过使用MYSQL_INIT_COMMAND
选项调用mysql_options()指定的任何 SQL 语句。
如果连接断开,则如果服务器尚未检测到 Client 端不再连接,则与服务器端的连接关联的会话可能仍在运行。在这种情况下,原始连接持有的所有锁仍属于该会话,因此您可能想通过调用mysql_kill()杀死它。