MySQL 连接器/C++.尝试在此过程中停止连接到数据库

MySQL Connector/C++. Trying to stop connecting to a DB in the process of it

本文关键字:过程中 连接 数据库 连接器 C++ MySQL      更新时间:2023-10-16
...
options["OPT_WRITE_TIMEOUT"] = timeout;   
std::lock_guard<std::recursive_mutex> locker(mutex_); 
auto driver = sql::mysql::get_driver_instance();
connection_.reset(driver->connect(options));
...

此代码在单个线程中执行。它就像一个连接线。

我想要的只是在建立连接的过程中停止此连接以启动新连接,例如,使用新的更改选项。难道没有一种安全的方法可以做到这一点,否则我注定要等到当前的连接尝试超过超时?

因此,get_driver_instance()的文档说您不能同时从多个线程调用它。 我想这是因为第一次调用它将创建驱动程序,因此该方法的重新输入可能会导致创建驱动程序的多个实例。 这一切都很好,因为您可以在程序的静态初始化期间在任何生成的线程之外调用此方法,因此无需使用互斥锁来保护它。 因此,您只需获取一次驱动程序并将其存储以供程序的其余部分使用。

driver->connect()的文档并没有说它不是可重入的,所以它可能是可重入的。这意味着您可以生成一个线程来尝试连接,并生成其他线程,这些线程也尝试使用不同的参数进行连接。

因此,您不应该在任何地方都需要互斥锁。 如果出于某种原因您确实不想获取一次驱动程序并将其存储以供以后使用,那么您可以使用互斥锁来防止重新输入对get_driver_instance()的调用,但您不会(也不应该(使用互斥锁来防止重新输入对driver->connect()的调用。 因此,您将能够从多个线程并行调用driver->connect()

顺便说一下,get_driver_instance()应该立即返回;这是可能需要很长时间的driver->connect()电话。