C++ Optins接口封装设置自动重连

当数据库突然断开的时候,API将接收不到MySQL的连接,在代码里面写关于自动重连可以实现数据库断开之后重连。

1、首先在LXMysql.h创建Option函数

	//mysql参数的设定 设置自动重连  在connect之前调用
	/*
	int STDCALL mysql_options(MYSQL *mysql, enum mysql_option option,
                          const void *arg);
						  */
	bool Option(LX_option opt, const void* arg);

在传入参数的时候,我们知道,关于在代码部分输入 mysql_options(),按住键盘ctrl,鼠标点击进入定义,我们可以看到关于mysql_options()的构造。

第一个就是mysql数据库,第二个是对应的mysql_option的枚举,第三个是一个对应的配置值。

int STDCALL mysql_options(MYSQL *mysql, enum mysql_option option,
                          const void *arg);

1.1、防止枚举被多次引用产生报错,我们可以自己定义一个枚举;

enum mysql_option的构造如下

enum mysql_option {
  MYSQL_OPT_CONNECT_TIMEOUT,
  MYSQL_OPT_COMPRESS,
  MYSQL_OPT_NAMED_PIPE,
  MYSQL_INIT_COMMAND,
  MYSQL_READ_DEFAULT_FILE,
  MYSQL_READ_DEFAULT_GROUP,
  MYSQL_SET_CHARSET_DIR,
  MYSQL_SET_CHARSET_NAME,
  MYSQL_OPT_LOCAL_INFILE,
  MYSQL_OPT_PROTOCOL,
  MYSQL_SHARED_MEMORY_BASE_NAME,
  MYSQL_OPT_READ_TIMEOUT,
  MYSQL_OPT_WRITE_TIMEOUT,
  MYSQL_OPT_USE_RESULT,
  MYSQL_REPORT_DATA_TRUNCATION,
  MYSQL_OPT_RECONNECT,
  MYSQL_PLUGIN_DIR,
  MYSQL_DEFAULT_AUTH,
  MYSQL_OPT_BIND,
  MYSQL_OPT_SSL_KEY,
  MYSQL_OPT_SSL_CERT,
  MYSQL_OPT_SSL_CA,
  MYSQL_OPT_SSL_CAPATH,
  MYSQL_OPT_SSL_CIPHER,
  MYSQL_OPT_SSL_CRL,
  MYSQL_OPT_SSL_CRLPATH,
  MYSQL_OPT_CONNECT_ATTR_RESET,
  MYSQL_OPT_CONNECT_ATTR_ADD,
  MYSQL_OPT_CONNECT_ATTR_DELETE,
  MYSQL_SERVER_PUBLIC_KEY,
  MYSQL_ENABLE_CLEARTEXT_PLUGIN,
  MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
  MYSQL_OPT_MAX_ALLOWED_PACKET,
  MYSQL_OPT_NET_BUFFER_LENGTH,
  MYSQL_OPT_TLS_VERSION,
  MYSQL_OPT_SSL_MODE,
  MYSQL_OPT_GET_SERVER_PUBLIC_KEY,
  MYSQL_OPT_RETRY_COUNT,
  MYSQL_OPT_OPTIONAL_RESULTSET_METADATA,
  MYSQL_OPT_SSL_FIPS_MODE,
  MYSQL_OPT_TLS_CIPHERSUITES,
  MYSQL_OPT_COMPRESSION_ALGORITHMS,
  MYSQL_OPT_ZSTD_COMPRESSION_LEVEL,
  MYSQL_OPT_LOAD_DATA_LOCAL_DIR,
  MYSQL_OPT_USER_PASSWORD,
  MYSQL_OPT_SSL_SESSION_DATA
};

1.2、重新创建一个类LXData,主要存放数据。将上述枚举的内容复制进去,为了防止命名冲突,将MYSQL_全部替换为LX_

enum LX_option {
		LX_OPT_CONNECT_TIMEOUT,
		LX_OPT_COMPRESS,
		LX_OPT_NAMED_PIPE,
		LX_INIT_COMMAND,
		LX_READ_DEFAULT_FILE,
		LX_READ_DEFAULT_GROUP,
		LX_SET_CHARSET_DIR,
		LX_SET_CHARSET_NAME,
		LX_OPT_LOCAL_INFILE,
		LX_OPT_PROTOCOL,
		LX_SHARED_MEMORY_BASE_NAME,
		LX_OPT_READ_TIMEOUT,
		LX_OPT_WRITE_TIMEOUT,
		LX_OPT_USE_RESULT,
		LX_REPORT_DATA_TRUNCATION,
		LX_OPT_RECONNECT,
		LX_PLUGIN_DIR,
		LX_DEFAULT_AUTH,
		LX_OPT_BIND,
		LX_OPT_SSL_KEY,
		LX_OPT_SSL_CERT,
		LX_OPT_SSL_CA,
		LX_OPT_SSL_CAPATH,
		LX_OPT_SSL_CIPHER,
		LX_OPT_SSL_CRL,
		LX_OPT_SSL_CRLPATH,
		LX_OPT_CONNECT_ATTR_RESET,
		LX_OPT_CONNECT_ATTR_ADD,
		LX_OPT_CONNECT_ATTR_DELETE,
		LX_SERVER_PUBLIC_KEY,
		LX_ENABLE_CLEARTEXT_PLUGIN,
		LX_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
		LX_OPT_MAX_ALLOWED_PACKET,
		LX_OPT_NET_BUFFER_LENGTH,
		LX_OPT_TLS_VERSION,
		LX_OPT_SSL_MODE,
		LX_OPT_GET_SERVER_PUBLIC_KEY,
		LX_OPT_RETRY_COUNT,
		LX_OPT_OPTIONAL_RESULTSET_METADATA,
		LX_OPT_SSL_FIPS_MODE,
		LX_OPT_TLS_CIPHERSUITES,
		LX_OPT_COMPRESSION_ALGORITHMS,
		LX_OPT_ZSTD_COMPRESSION_LEVEL,
		LX_OPT_LOAD_DATA_LOCAL_DIR,
		LX_OPT_USER_PASSWORD,
		LX_OPT_SSL_SESSION_DATA
	};

2、在LXMysql.h中引入#include"LXData.h"

#include"LXData.h"

3、在test_LXMysql.cpp里面编写代码

bool LXMysql::Option(LX_option opt, const void* arg)
	{
		if (!mysql)//如果mysql没有初始化好
		{
			cerr << "Option failed: mysql is NULL" << endl;
			return false;
		}
		//(mysql_option)opt 强转opt
		int re = mysql_options(mysql, (mysql_option)opt, arg);
		if (re != 0)
		{
			cerr << "mysql_options failed!" << mysql_error(mysql) << endl;
			return false;
		}


		return true;
	}

4、编写超时和重连函数,分别在LXMysql.h和LXMysql.cpp定义和编写

    //连接超时时间
	bool SetConnectTimeout(int sec);
	//自动重连,默认不自动
	bool SetReConnect(bool isre = true);
    bool LXMysql::SetConnectTimeout(int sec)
	{
		return Option(LX_OPT_CONNECT_TIMEOUT, &sec);
	}

	bool LXMysql::SetReConnect(bool isre)
	{
		return Option(LX_OPT_RECONNECT, &isre);
	}

5、测试,在test_LXMysql.cpp里面测试,测试重连必须在Connect函数之前

     //连接超时秒
    my.SetConnectTimeout(3);
    //自动重连
    my.SetReConnect(true);

6、测试是否成功


   // 测试自动重连是否生效
    for (;;)
      {
       //flush 刷新一下
        cout << my.Query(sql.c_str()) << flush;
      }

7、测试2

7.1、打开数据库,你会发现终端一直输出111111.....

7.1、关闭数据库之后,终端输出0,并且报错连接不到

7.3、重新打开数据库,会发现终端又重新开始输出11111...

相关推荐

  1. C++ Optins接口封装设置自动

    2024-01-05 17:20:03       53 阅读
  2. .NET6 RabbitMQ自动

    2024-01-05 17:20:03       55 阅读
  3. uniapp封装websocket以及心跳检测、

    2024-01-05 17:20:03       35 阅读
  4. vue封装websocket以及心跳检测、

    2024-01-05 17:20:03       36 阅读
  5. WebSocket 断网、心跳检测功能封装

    2024-01-05 17:20:03       30 阅读
  6. MySQL数据库连接超时和自动

    2024-01-05 17:20:03       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-05 17:20:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-05 17:20:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-05 17:20:03       87 阅读
  4. Python语言-面向对象

    2024-01-05 17:20:03       96 阅读

热门阅读

  1. ArrayList 与 LinkedList 的选择与应用

    2024-01-05 17:20:03       67 阅读
  2. c++,mutex,unique_lock,recursive_mutex,shared_mutex对比分析

    2024-01-05 17:20:03       47 阅读
  3. 【微服务】微服务详解、模块化开发详解

    2024-01-05 17:20:03       56 阅读
  4. MySQL运维实战(2.3)MySQL的权限体系

    2024-01-05 17:20:03       54 阅读
  5. Hbase 的三个应用

    2024-01-05 17:20:03       47 阅读
  6. 【React】04-关于React Props的实践

    2024-01-05 17:20:03       51 阅读
  7. 如何有效使用 .gitignore 文件

    2024-01-05 17:20:03       54 阅读
  8. Spring aspect 解析

    2024-01-05 17:20:03       52 阅读
  9. Verilog视频信号图形显示 FPGA(iCE40)

    2024-01-05 17:20:03       66 阅读
  10. 网络安全试题进阶——附答案

    2024-01-05 17:20:03       62 阅读
  11. LeetCode50. Pow(x, n)

    2024-01-05 17:20:03       52 阅读