MySQL, Connector / C ++. Попытка прекратить подключение к БД в процессе этого

...
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));
...

Этот код выполняется в одном потоке. Это как нить подключения.

Все, что я хочу, — это остановить это соединение в процессе установления соединения, чтобы начать новое соединение, скажем, с новыми измененными параметрами. Разве не может быть безопасного способа сделать это, или я обречен ждать, пока текущая попытка соединения не превысит время ожидания?

0

Решение

Итак, документация get_driver_instance() говорит, что вы не должны одновременно вызывать его из нескольких потоков. Я полагаю, это потому, что при первом вызове он создает драйвер, поэтому повторный ввод этого метода может привести к созданию нескольких экземпляров драйвера. Это все очень хорошо, потому что вы можете вызывать этот метод во время статической инициализации вашей программы вне каких-либо порождаемых потоков, поэтому нет необходимости защищать его мьютексом. Таким образом, вы получаете драйвер один раз и сохраняете его для использования остальной частью вашей программы.

Документация driver->connect() делает не сказать, что это не повторный вход, так что это, вероятно, является Реентрантная. Это означает, что вы можете создать один поток, чтобы попытаться подключиться, и создать дополнительные потоки, которые также пытаются подключиться с различными параметрами.

Таким образом, вам не нужно нигде мьютекс. Если по какой-то причине вы действительно не хотите получить драйвер один раз и сохранить его для последующего использования, то вы можете использовать мьютекс для защиты от повторного ввода вызова get_driver_instance(), но вы не должны (и не должны) использовать мьютекс для защиты от повторного входа в вызов driver->connect(), Таким образом, вы сможете вызвать driver->connect() параллельно из нескольких потоков.

Между прочим, get_driver_instance() должен вернуться немедленно; это driver->connect() звонок, который может занять много времени.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector