MySQL Connector/C++。尝试在连接过程中停止连接到数据库

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

...
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() 的文档 not 说它不可重入,所以它可能 可重入。这意味着您可以生成一个线程来尝试连接,并生成其他线程也尝试使用不同的参数进行连接。

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

顺便说一下,get_driver_instance() 应该 return 立即; driver->connect() 调用可能需要很长时间。