1

我正在创建一个实验,其中服务器端是一个基于 libuv 的 C/C++ 应用程序,它在 mysql 服务器上运行查询(它在 localhost 上)。

在大多数情况下,它可以正常工作,但有时我会在此过程中的各个地方收到“查询期间与 MySQL 服务器的连接丢失”。

我试过提高所有的超时时间。但我认为这是不相关的,如果服务器被请求轰炸(比如每秒),同样的错误就会被抛出。

+-------------------------------------+----------+
| Variable_name                       | Value    |
+-------------------------------------+----------+
| connect_timeout                     | 31536000 |
| deadlock_timeout_long               | 50000000 |
| deadlock_timeout_short              | 10000    |
| delayed_insert_timeout              | 300      |
| innodb_flush_log_at_timeout         | 1        |
| innodb_lock_wait_timeout            | 50       |
| innodb_print_lock_wait_timeout_info | OFF      |
| innodb_rollback_on_timeout          | OFF      |
| interactive_timeout                 | 31536000 |
| lock_wait_timeout                   | 31536000 |
| net_read_timeout                    | 31536000 |
| net_write_timeout                   | 31536000 |
| slave_net_timeout                   | 31536000 |
| thread_pool_idle_timeout            | 60       |
| wait_timeout                        | 31536000 |
+-------------------------------------+----------+

在进行查询之前,我正在 ping 服务器。

    // this->con was set up somewhere before, just like down below in the retry section

    char query[] = "SELECT * FROM data WHERE id = 12;";

    mysql_ping(this->con);
    if(!mysql_query(this->con, query)) {
        // OK
        return 0;
    } else {
        // reconnect usually helps
        // here I get the error message
        mysql_close(this->con);
        this->con = mysql_init(NULL);
        if(mysql_real_connect(this->con, this->host.c_str(), this->user.c_str(), this->password.c_str(), this->db.c_str(), 0, NULL, 0) == NULL) {
            // no DB, goodbye
            exit(6);
        }
        // retry
        if(!mysql_query(this->con, query)) {
            return 0;
        } else {
            // DB fail
            return 1;
        }
    }

我试过重新连接选项,问题是一样的。

据我了解,单线程 libuv 和 mysql 应该可以实现此流程:

1. set up db connection
2. run event loop
    -> make queries based on IO events, get results
3. event loop ends
4. db close

我想念什么?

4

0 回答 0