Я использую Boost.MySQL с версией Boost 1.84. Я хочу использовать соединение, поэтому создал класс и добавил переменную-член соединения. Я получаю соединение с сервера 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;
}
Спасибо @john, я исправил код. проблема все та же.





Для справки: проблема в том, что объект tcp_ssl_connection используется после того, как объекты io_context и ssl::context выходят за пределы области видимости. Их необходимо поддерживать в рабочем состоянии, пока вы используете соединение.
Кажется, вы используете переменную
_connectionдо ее инициализации (здесь_connection->execute("SELECT 1", results);). Возможно, это неправда, но если это так, вам нужно опубликовать код, в котором вы инициализируете эту переменную.