You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于销毁boost::mysql连接对象时出现错误的技术求助

使用Boost.MySQL创建与销毁数据库连接时的错误问题

在C++中使用Boost库的Boost.MySQL组件,通过本地io_context和ssl_context创建并销毁数据库连接时遇到错误。以下是最小可复现示例代码:

class DatabaseProcess : public MainframeComponent
{
public:
    // MainframeComponent dispatch module type is set to Main because DatabaseProcess doesn't run on its own thread.
    DatabaseProcess() : MainframeComponent(Horizon::System::RUNTIME_DATABASE) { }
    ~DatabaseProcess() 
    { 
    }
    
    void initialize(int segment_number = 1) override { HLog(error) << "Database not configured"; }
    void initialize(int segment_number, std::string host, int port, std::string user, std::string pass, std::string database);

    void finalize(int segment_number = 1) override 
    {
        // Close connection object.
        if (_connection != nullptr) {
            _connection->close();
        }
        
        bool value = _is_initialized;
        _is_initialized.compare_exchange_strong(value, false);
    }

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

    bool is_initialized() { return _is_initialized.load(); }
protected:
    std::shared_ptr<boost::asio::ssl::context> _ssl_ctx{nullptr};
    std::shared_ptr<boost::mysql::tcp_ssl_connection> _connection{nullptr};
    boost::asio::io_context _db_io_context;
    std::atomic<bool> _is_initialized;
};

void DatabaseProcess::initialize(int segment_number, std::string host, int port, std::string user, std::string pass, std::string database)
{
    try {
        _ssl_ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tls_client);
        _connection = std::make_shared<boost::mysql::tcp_ssl_connection>(_db_io_context.get_executor(), *_ssl_ctx);
        boost::asio::ip::tcp::resolver resolver(_db_io_context.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);
}

错误截图

内容的提问来源于stack exchange,提问作者SagunKho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:32:40