星际漫游者
发布于

++ 中文件句柄请求的 Boost.MySQL 问题

我正在使用 boost 版本 1.84 的 Boost.MySQL。我想使用连接,因此我创建了一个类并添加了一个连接成员变量。我从 MySQL 服务器获取一个连接,并将该连接保存在类中。接下来发生的情况是,当我访问连接时,我收到一个文件句柄错误。

The file handle supplied is not valid [system:10009]
与保存连接相关的代码如下 -

  
    void initialize(std::string host, int port, std::string user, std::string pass, std::string database)
    {
        try {
            boost::asio::io_context ctx;
            boost::asio::ssl::context ssl_ctx(boost::asio::ssl::context::tls_client);
            _connection = std::make_shared<boost::mysql::tcp_ssl_connection>(ctx.get_executor(), ssl_ctx);
            boost::asio::ip::tcp::resolver resolver(ctx.get_executor());
            auto endpoints = resolver.resolve(host, std::to_string(port));
            boost::mysql::handshake_params params(user, pass, database);
            _connection->connect(*endpoints.begin(), params);
        } catch (boost::mysql::error_with_diagnostics &error) {
            HLog(error) << error.what();
        }

        bool value = _is_initialized;
        _is_initialized.compare_exchange_strong(value, true);
    }

    std::shared_ptr<boost::mysql::tcp_ssl_connection> get_connection() { return _connection; }

该变量保存在类中,稍后我可以调用一个小函数来测试连接 -_connection

  
    std::shared_ptr<boost::mysql::tcp_ssl_connection> get_database_connection() 
    { 
        return get_component<DatabaseProcess>(DATABASE_MAINFRAME)->get_connection();
    }
    
    bool test_database_connection()
    {
        try {
            const char *sql = "SELECT 'Hello World!'";
            boost::mysql::results result;
            get_database_connection()->execute(sql, result);

            if (result.rows().at(0).at(0).as_string().compare("Hello World!") == 0)
                return true;
        } catch (boost::mysql::error_with_diagnostics &error) {
            HLog(error) << error.what();
        }
        return false;
    }
浏览 (47)
点赞
收藏
1条评论
Klustron小助手
供参考:问题是在 and 对象超出范围之后使用对象。只要您使用连接,它们就需要保持活动状态 tcp_ssl_connectionio_contextssl::context
点赞
评论