Russian Qt Forum
Май 03, 2024, 17:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Проверка состояния подключения к БД.  (Прочитано 17967 раз)
titan83
Гость
« Ответ #15 : Март 11, 2016, 18:15 »

Коллеги, чтобы не плодить темы спрошу здесь.
У меня тоже ODBC соединение, все подключается, все здорово.
Есть функционал проверки доступности подключения и переподключения при разрыве соединения.
И вот здесь у меня проблема: принципиально все работает, но память течет(
После каждого вызова open() для QSqlDatabase я теряю ~70кб, а так как проверка доступности сервера выполняется довольно часто (раз в 30 секунд), то память течет со скоростью 1Мб в час, мне это крайне не нравится. Но как это исправить пока ума не приложу.
QWshDatabase::open() - это слот, который вызывается при каждой попытке переподключения. И после каждого _db.open() я теряю память.
Кто как решает эту проблему?
Спасибо.

Код:
QWshDatabase::QWshDatabase()
{
    _db = QSqlDatabase::addDatabase("QODBC");
    _query = new QSqlQuery(_db);
    connect(this, SIGNAL(queryFail(QString)), this, SLOT(close()));
}

QWshDatabase::~QWshDatabase()
{
    delete _query;
}

bool QWshDatabase::open()
{
    if (!(_db.isOpen())) {
        _db.setDatabaseName(connectionName());
        _db.setUserName(username());
        _db.setPassword(password());

        if (_db.open()) {
            emit openSuccess();
            _prevConnetionWasSuccess = true;
            return true;
        } else {
            qDebug() << "db open fail";
            if (_prevConnetionWasSuccess)
                emit openFail("Database: open failed with error - " + _db.lastError().text());
            else
                emit openFail("Database: try to restore connection");

            _prevConnetionWasSuccess = false;
            return false;
        }
    }

    return true;
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #16 : Март 11, 2016, 18:30 »

Ну так загляните в исходники драйвера для ODBC, посмотрите что именно выделяется (какая структура данных?), кто ее должен освобождать, когда...
Может нужно просто делать close соединению, при обнаружении отключения.
Записан
titan83
Гость
« Ответ #17 : Март 11, 2016, 20:06 »

Ну так загляните в исходники драйвера для ODBC, посмотрите что именно выделяется (какая структура данных?), кто ее должен освобождать, когда...
Может нужно просто делать close соединению, при обнаружении отключения.
Old, спасибо за комментарий.
В код глядел, ничего гиперстрашного не увидел, все переменные локальные, ничего там не создается динамически.
Код:
    QVarLengthArray<SQLTCHAR> connOut(1024);
    memset(connOut.data(), 0, connOut.size() * sizeof(SQLTCHAR));
    r = SQLDriverConnect(d->hDbc,
                          NULL,
                          toSQLTCHAR(connQStr).data(),
                          (SQLSMALLINT)connQStr.length(),
                          connOut.data(),
                          1024,
                          &cb,
                          /*SQL_DRIVER_NOPROMPT*/0);

    if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) {
        setLastError(qMakeError(tr("Unable to connect"), QSqlError::ConnectionError, d));
        setOpenError(true);
        return false;
    }

По вызову close() делается и cleanup(), в котором есть пара SQLFreeHandle.
Но моя проблема в том, что я имею утечку памяти еще ДО ТОГО, как я установил соединение. Т.е. программа запускается, пробует соединиться, не получается, через 30 секунд пробует снова и так далее.
Хотя я делал close() при неудачной попытке соединения - это не влияло на ситуацию.
Записан
titan83
Гость
« Ответ #18 : Март 11, 2016, 20:22 »

Похоже, что шляпа герцога на нижнем слое...
http://www.qtcentre.org/threads/39978-Experiencing-Memory-Leak-using-QODBC
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.