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 锁均已释放。

  • 所有TEMPORARYtable 均已关闭(并删除)。

  • 会话系统变量将重新初始化为相应的全局系统变量的值,包括由诸如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()杀死它。