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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вставленая в postgresql через QSqlQuery строка появляется с задержкой  (Прочитано 5201 раз)
nickla
Гость
« : Июнь 05, 2012, 11:03 »

Я вставляю строку в таблицу. Все проходит успешно и быстро, но для всех qt соединений эта строка почемуто появляется с задержкой в 20-30 секунд. Вставляю строку и смотрю таблицу в PgAdmin - все отлично и появляется моментально.

Пробовал делать следующее: добавляю строку, выключаю программу, включаю и смотрю - строки нет и появляется она с той же задержкой. Создается ощущение что постгрес специально для qt соединений и только этой таблицы использует задержку в 20-30 сек.

Данная фигня возникает только с одной моей таблицей. Добавляю записи в другие - все тут же появляется как и положено.
Записан
nickla
Гость
« Ответ #1 : Июнь 05, 2012, 11:04 »

Кто нибудь сталкивался с таким? Полдня бьюсь не могу понять почему. Кажется что виновато именно QT - както не так оно работает чтоли с постгресом раз такое возникает на эту таблицу.

К данной таблице идет запрос 1 раз в секунду. Теоритически может какой кеш где в постгресе заюзался?
Записан
nickla
Гость
« Ответ #2 : Июнь 05, 2012, 11:13 »

Я использую вот такой код для вставки:

Код:
    QString sql = this->createInsertSql(table, field);
    query.prepare(sql);
    this->bindValues(query, field);

    if (!query.exec()) {
        throw ErrorHandler((quint16)ERROR_SQL_EXECUTE, query.lastError().text(), QString(__FILE__), __LINE__);
    }

Получаю строки используя примерно вот такой код:
Код:
    QString sql = "SELECT " + DbTableField::instance()->getFieldsAsSQL(TABLE_ORDER, "to1")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_ORDER_STATUS, "tos1")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_USER_DRIVER, "tud1")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_USER_MANAGER, "tum1")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_USER_MANAGER, "tum2")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_USER_MANAGER, "tum3")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_PHONE, "tp1")
            + ", " + DbTableField::instance()->getFieldsAsSQL(TABLE_PHONE, "tp2")
            + " FROM " + TABLE_ORDER + " to1"
            + " JOIN " + TABLE_ORDER_STATUS + " tos1 ON to1.status_id = tos1.id"
            + " JOIN " + TABLE_USER_MANAGER + " tum1 ON tum1.id = to1.created_by"
            + " JOIN " + TABLE_PHONE + " tp1 ON tp1.id = to1.phone_id"
            + " LEFT JOIN " + TABLE_USER_DRIVER + " tud1 ON tud1.id = to1.driver_id"
            + " LEFT JOIN " + TABLE_PHONE + " tp2 ON tp2.id = tud1.phone_id"
            + " LEFT JOIN " + TABLE_USER_MANAGER + " tum2 ON tum2.id = to1.driver_set_by"
            + " LEFT JOIN " + TABLE_USER_MANAGER + " tum3 ON tum3.id = to1.client_called_by"
            + " WHERE to1.booking_time > ? AND to1.booking_time < current_timestamp"
            + " ORDER BY tos1.sort_order DESC, to1.updated_at DESC, to1.created_at DESC";

    query.prepare(sql);
    query.bindValue(0, m_Filter.getValueByField("booking_time").value().toDateTime().toString(Qt::ISODate));

    if (!query.exec()) {
        throw ErrorHandler((quint16)ERROR_SQL_EXECUTE, query.lastError().text(), QString(__FILE__), __LINE__);
    }
Записан
V1KT0P
Гость
« Ответ #3 : Июнь 05, 2012, 13:19 »

Может быть проблема с транзакциями? Попробуй их вручную коммитить("bool QSqlDatabase::commit()").
Записан
GraninDm
Гость
« Ответ #4 : Июнь 06, 2012, 11:50 »

Посмотрите план запроса select...
Записан
RVZ
Гость
« Ответ #5 : Июнь 13, 2012, 13:42 »

Цитировать
Посмотрите план запроса select...

Действительно как результат в ПгАдмин проверяешь?Непонимающий
Надо получившийся селект выполнить и посмотреть сколько он будет выполнятся.
P.S. Сейчас только начинаю работать с PGSQL (9.1) работает быстро!!! ни каких задержек не замечал (правдо соединение одно на все время жизни приложения).
Записан
Alex_C
Гость
« Ответ #6 : Июнь 23, 2012, 00:13 »

но для всех qt соединений эта строка почемуто появляется с задержкой в 20-30 секунд.

Думаю, моя информация Вам поможет. Не знаю как в postgresql , но в MS Access базах существует аналогичное "правило 4 секунд" - в таблицу все записывается, но другие соединения могут увидеть внесенные изменения только через 4 секунды.  Зачем это сделано - не знаю. Но в MSDN есть решение этой проблемы. Думаю, что покопавшись в доке по postgresql найдете нужное решение.
Записан
Alex_C
Гость
« Ответ #7 : Июнь 23, 2012, 00:15 »

Да. еще раз хочу обратить внимание: ни запросы, ни трансзакции - тут не причем. Это сугубо установки БД.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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