MySQL, Connector / C ++.Попытка прекратить подключение к БД в процессе этого - PullRequest
0 голосов
/ 12 сентября 2018
...
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));
...

Этот код выполняется в одном потоке.Это похоже на поток соединения.

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

1 Ответ

0 голосов
/ 12 сентября 2018

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

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

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

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

...