Название: Проверка состояния подключения к БД. Отправлено: ksergey85 от Сентября 16, 2015, 16:39 Пользователи драйвера QODBC, подскажите пожалуйста как вы проверяете состояние коннекта к БД на предмет умерло/не умерло? Не дело ведь это выполнять "SELECT 1" после каждого неудачно выполненного запроса только для того, чтобы проверить не отвалился ли коннект. Или как-то по коду ошибки QSqlError все-таки можно догадаться, что запрос обломался именно по причине отпавшего коннекта. ???
Погуглив, нашел только вот что https://bugreports.qt.io/browse/QTBUG-223 (https://bugreports.qt.io/browse/QTBUG-223). Закрыто в 2013. Никаких вразумительных комментариев. Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 16, 2015, 17:58 Не знаю что там есть для ODBC, а для postgresql и mysql я в отдельном потоке с заданным интервалом проверяю валидность соединения и при его разрыве посылаю сигнал об этом.
Название: Re: Проверка состояния подключения к БД. Отправлено: ksergey85 от Сентября 16, 2015, 18:05 Не знаю что там есть для ODBC, а для postgresql и mysql я в отдельном потоке с заданным интервалом проверяю валидность соединения и при его разрыве посылаю сигнал об этом. Как проверяете? Можно кода? Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 16, 2015, 18:14 Как проверяете? Можно кода? Кода можно будет только завтра, сейчас смогу только на словах.Создаем отдельное тестовое подключение, запускаем поток, в котором по таймеру выполняется слот. В слоте проверяем валидность подключения проверяя открыто ли соединение и пытаясь выполнить запрос "SELECT TRUE", если все нормально - выходим из слота. Иначе посылаем сигнал об отключении базы и пытаемся переподключиться. Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Сентября 17, 2015, 20:05 Цитировать В слоте проверяем валидность подключения проверяя открыто ли соединение Если речь про isOpen, то оно true выдает даже после разрыва связи с БД. Разве нет?Цитировать и пытаясь выполнить запрос "SELECT TRUE", если все нормально - выходим из слота. Результат запроса (false) у вас сразу приходит или с таймаутом каким-то?Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 17, 2015, 20:14 Если речь про isOpen, то оно true выдает даже после разрыва связи с БД. Разве нет? Да, поэтому и нужен второй запрос.Результат запроса (false) у вас сразу приходит или с таймаутом каким-то? Сразу. Отдельная нитка нужна, что бы попытка переподключения не блокировала основную нить и не морозила UI. Открытие соединения с не отвечающим сервером БД заметно тормозит нить.Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Сентября 17, 2015, 20:20 Понятно, тогда тоже +1 к посмотреть код
(интересует как сама нитка создается и подключение в ней) Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 17, 2015, 20:24 Понятно, тогда тоже +1 к посмотреть код Если я утром забуду, напишите сообщение в этой теме еще раз (или в личку) - я выложу.(интересует как сама нитка создается и подключение в ней) Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 18, 2015, 10:23 Код
Код
Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Сентября 18, 2015, 19:09 Цитировать Создаем отдельное тестовое подключение Имеется ввиду addDatabase?Судя по вашему коду используется defaultConnection? Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 18, 2015, 19:30 Цитировать Создаем отдельное тестовое подключение Имеется ввиду addDatabase?Судя по вашему коду используется defaultConnection? Я создаю рабочее соединение, клонирую его и клон передаю ватчеру для проверки. Для каждого потока нужно отдельное соединение. Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Сентября 18, 2015, 19:40 А если в процессе работы требуется отключиться от БД
Цитировать void QSqlDatabase::removeDatabase ( const QString & connectionName ) и подключиться с другими параметрами - потребуется ли пересоздать ватчер?Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Сентября 18, 2015, 21:00 А если в процессе работы требуется отключиться от БД Нет. Достаточно будет сделать setConnection с клоном нового подключения.Цитировать void QSqlDatabase::removeDatabase ( const QString & connectionName ) и подключиться с другими параметрами - потребуется ли пересоздать ватчер?Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Сентября 18, 2015, 22:37 Спасибо за информацию
Название: Re: Проверка состояния подключения к БД. Отправлено: Nidxogg от Декабря 03, 2015, 20:42 del
Название: Re: Проверка состояния подключения к БД. Отправлено: titan83 от Марта 11, 2016, 18:15 Коллеги, чтобы не плодить темы спрошу здесь.
У меня тоже ODBC соединение, все подключается, все здорово. Есть функционал проверки доступности подключения и переподключения при разрыве соединения. И вот здесь у меня проблема: принципиально все работает, но память течет( После каждого вызова open() для QSqlDatabase я теряю ~70кб, а так как проверка доступности сервера выполняется довольно часто (раз в 30 секунд), то память течет со скоростью 1Мб в час, мне это крайне не нравится. Но как это исправить пока ума не приложу. QWshDatabase::open() - это слот, который вызывается при каждой попытке переподключения. И после каждого _db.open() я теряю память. Кто как решает эту проблему? Спасибо. Код: QWshDatabase::QWshDatabase() Название: Re: Проверка состояния подключения к БД. Отправлено: Old от Марта 11, 2016, 18:30 Ну так загляните в исходники драйвера для ODBC, посмотрите что именно выделяется (какая структура данных?), кто ее должен освобождать, когда...
Может нужно просто делать close соединению, при обнаружении отключения. Название: Re: Проверка состояния подключения к БД. Отправлено: titan83 от Марта 11, 2016, 20:06 Ну так загляните в исходники драйвера для ODBC, посмотрите что именно выделяется (какая структура данных?), кто ее должен освобождать, когда... Old, спасибо за комментарий.Может нужно просто делать close соединению, при обнаружении отключения. В код глядел, ничего гиперстрашного не увидел, все переменные локальные, ничего там не создается динамически. Код: QVarLengthArray<SQLTCHAR> connOut(1024); По вызову close() делается и cleanup(), в котором есть пара SQLFreeHandle. Но моя проблема в том, что я имею утечку памяти еще ДО ТОГО, как я установил соединение. Т.е. программа запускается, пробует соединиться, не получается, через 30 секунд пробует снова и так далее. Хотя я делал close() при неудачной попытке соединения - это не влияло на ситуацию. Название: Re: Проверка состояния подключения к БД. Отправлено: titan83 от Марта 11, 2016, 20:22 Похоже, что шляпа герцога на нижнем слое...
http://www.qtcentre.org/threads/39978-Experiencing-Memory-Leak-using-QODBC |