关于销毁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
相关产品推荐
相关产品推荐

