【问题标题】:MySQL Connector/C++. Trying to stop connecting to a DB in the process of itMySQL 连接器/C++。尝试在此过程中停止连接到数据库
【发布时间】:2019-02-17 01:19:18
【问题描述】:
...
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));
...

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

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

【问题讨论】:

  • 当您启动另一个线程以尝试使用新参数进行另一个连接时,您不能让这个线程运行完成吗?
  • @MikeNakis 我认为“sql::mysql::get_driver_instance()”可以创建唯一的“驱动程序”实例(如单例),因此我只能同时创建一个新连接通过使用互斥锁保护进程。所以我只能保护“sql::mysql::get_driver_instance();”使用互斥锁的方法,然后开始创建没有任何互斥锁的新连接,对吗?附言我不知道是什么让我认为“连接”方法也必须受到 mutext 的保护:/
  • 好吧,我不知道。我很难相信get_driver_instance()driver-&gt;connect() 需要防止再次进入,但我真的不知道。
  • @MikeNakis as its documentation 表示我们唯一需要的是避免多个线程同时调用此函数。但是现在我真的很怀疑我们是否需要在每次开始连接之前调用它(这类似于驱动程序的初始化)。如果它必须只调用一次并带有互斥锁保护并且没有任何必要再次调用它吗?老实说,这将使我的代码更容易和更愉快。有什么想法可以让我准确了解它吗?谢谢!

标签: c++ mysql-connector connection-timeout mysql-connect


【解决方案1】:

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

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

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

顺便说一句,get_driver_instance() 应该立即返回; driver-&gt;connect() 调用可能需要很长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2022-11-20
    • 2011-11-18
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多