У меня есть приложение C ++ QT, работающее на многих устройствах, которое должно взаимодействовать с сервером MS SQL.
Я использую драйвер QODBC3 (unixODBC).
Соединение SQL один раз инициализируется и подключается, а затем используется повторно. Благодаря этому запрос выполняется быстро (максимум 20 мс).
Everythink отлично работает, когда нет проблем с подключением. Когда сетевое соединение потеряно даже на короткое время, соединение SQL не может «переподключиться».
Я пытался проверить, включено ли соединение перед каждой попыткой запроса, но QSqlDatabase::isOpen()
возвращает истину, если close()
называется. Не меняется после проблем с сетью.
По моему мнению, лучшим способом было бы установить таймер в драйвере ODBC на некоторое короткое время и попытаться восстановить соединение, когда истечет время ожидания. Но время ожидания в ODBC установлено равным приблизительно 15 минутам, и я не смог установить другое значение.
SQLConnection.setConnectOptions("SQL_ATTR_CONNECTION_TIMEOUT=5");
Эта команда, похоже, ничего не меняет, я даже пытался завершить ерунду в строке, но без ошибок или чего-то еще.
Моя следующая попытка состояла в том, чтобы пинговать сервер каждый раз перед запуском запроса, но если сетевое соединение снова включается, пинг сбрасывается, а соединение SQL по-прежнему разрывается.
Мое «временное» решение состоит в том, чтобы открывать соединение SQL перед каждым запросом, а затем закрывать его (с пингом перед открытием). Но это решение продлевает каждый запрос до 500 мс, и я не очень доволен этим.
Четыре возможных решения с моей стороны:
Задача ещё не решена.
Других решений пока нет …