Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / QSqlQuery + Firebird длительное ожидание ответа на query->next() / 25 сообщений из 36, страница 1 из 2
09.09.2013, 01:50
    #38390577
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Всем привет! Даже не знаю, туда ли я написал.

Есть программа на Qt 4.8.1 (работает под виндой), Firebird 2.5.2. Драйвер собран из исходников Qt с использованием fbclient_ms.lib.

Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE (
ADDR SMALLINT NOT NULL,
TAG SMALLINT NOT NULL,
VAL FLOAT,
DATE_TIME TIMESTAMP,
REQ_UPDATE INTEGER NOT NULL,
REAL_TIME INTEGER NOT NULL,
REQ_WRITE INTEGER NOT NULL,
CONSTRAINT UNQ_ADDR_TAG UNIQUE (ADDR,TAG)
)



Таблица имеет 7680 записей. 30 - ADDR на каждый приходится 256 - TAG

Выполняется запрос
Код: sql
1.
2.
3.
4.
SELECT TAG, VAL FROM RTTABLE 
    WHERE ADDR = 1 
              AND REAL_TIME = 1
              AND REQ_WRITE = 0



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

И самое странное, что задержка возникает при вызове первого query->next();

Код следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    if(!query->prepare(
        "SELECT TAG, VAL FROM RTTABLE "
             "WHERE ADDR = :id_addr "
                    "AND REAL_TIME = 1 "
                    "AND REQ_WRITE = 0 "
        )
    ){
        qDebug() << "IRTPoolTags::getPoolIncTags query->prepare"
                 << query->lastError();
        return;
    }

    query->bindValue(":id_addr",curAddr);

    if(!query->exec()){
        qDebug() << "IRTPoolTags::getPoolIncTags query->exec"
                 << query->lastError();
        return;
    }

    while(query->next()){
        PoolTag poolTag;
        poolTag.tag = query->value(0).toInt();
        poolTag.val = query->value(1).toDouble();

        listTag.append(poolTag);
    }



Вот первый «query->next()» и тормозит дальше как по маслу.

query создается в конструкторе:
Код: plaintext
1.
query = new QSqlQuery(db);



Предварительно db создается и открывается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
bool IncPool::openDB()
{
    db =  QSqlDatabase::addDatabase("QIBASE",threadID);

    db.setDatabaseName ("INCBASE") ;
    db.setUserName ("sysdba") ;
    db.setPassword("masterkey") ;

    db.setHostName ("localhost") ;

    if (!db.open()) {

        qDebug() << lastError;
        return false;
    }
    return true;
}


где threadID поле получаемое следующим образом:
Код: plaintext
1.
2.
    threadID = QString::number(
                (qint32)QThread::currentThreadId(), 16).toUpper();



Поток пока одни REAL_TIME = 1 AND REQ_WRITE = 0 устанавливает другое приложение. В принципе все работает, но вот при первом включение такая засада.

Пробовал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    if(!query->first()){
        return;
    }

    do{
        PoolTag poolTag;
        poolTag.tag = query->value(0).toInt();
        poolTag.val = query->value(1).toDouble();

        listTag.append(poolTag);
    }while(query->next());



Таже задержка только query->first().

В общем, не могу понять, как с этим бороться. Может, кто что подскажет? Буду очень признателен.
...
Рейтинг: 0 / 0
09.09.2013, 02:22
    #38390585
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaДаже не знаю, туда ли я написал.
Не, не туда. Тут про С++, а у вас что-то другое.
agodaпервое обращение может выполняться до 5 и более минут, а последующие обращения занимают миллисекунды
База локальная. Может антивирус проверяет базу в первый раз?
Потому что 7000 записей никак не могут считываться 5 минут - т.е. тут дело не в SQL, а в каких то посторонних факторах.
...
Рейтинг: 0 / 0
09.09.2013, 07:45
    #38390616
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agoda,

Видимо, дело в бд, а не в клиенте.
Первый fetch - это просто выполнение запроса до стадии получения первой записи.
Попробуй проверить есть ли такой же эффект без использования этой программы, выполняя этот же запрос через какую-нибудь консоль.
...
Рейтинг: 0 / 0
09.09.2013, 11:50
    #38390818
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Anatoly MoskovskyagodaДаже не знаю, туда ли я написал.
Не, не туда. Тут про С++, а у вас что-то другое.

Прошу прощения, но я не нашел подходящего форума для такого вопроса. Толи база, толи код на С++, толи как вы написали антивирус. Увидел задержку после query->next() и решил написать в С++.

Anatoly Moskovskyagodaпервое обращение может выполняться до 5 и более минут, а последующие обращения занимают миллисекунды
База локальная. Может антивирус проверяет базу в первый раз?
Потому что 7000 записей никак не могут считываться 5 минут - т.е. тут дело не в SQL, а в каких то посторонних факторах.

Про антивирус я и не подумал, хотя на похожие грабли уже наступал. Спасибо, вечером попробую. База локальная.
...
Рейтинг: 0 / 0
09.09.2013, 12:04
    #38390846
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Anatoly MoskovskyМожет антивирус проверяет базу в первый раз?

В этом случае тормоза были бы на connect.

Qt драйвер для Firebird вообще известен своей кривизной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.09.2013, 12:43
    #38390875
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovAnatoly MoskovskyМожет антивирус проверяет базу в первый раз?

В этом случае тормоза были бы на connect.

Qt драйвер для Firebird вообще известен своей кривизной.
И как быть? Отказаться от Qt?
Я, правда, еще не проверил теорию с антивирусом…
...
Рейтинг: 0 / 0
09.09.2013, 12:47
    #38390881
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaИ как быть? Отказаться от Qt?
Лично я бы так и сделал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.09.2013, 13:24
    #38390917
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovagodaИ как быть? Отказаться от Qt?
Лично я бы так и сделал.
Мне нужен толстый клиент для нескольких рабочих станций виндовых и линуховых. Я пробовал Лазарус, но там были глюки с полосами прокруток, хинтами и т.д. Плюс, то что работало в винде не всегда работало в линухе. Попробовал Qt. Гуй как-то менее глючный показался. Да и с базой работал, только вылезло вот это неприятное место.

А как на счет Qt SQL driver for Firebird with IBPP library qtfirebirdibppsqldriver? Я тут начал просматривать альтернативы…
...
Рейтинг: 0 / 0
09.09.2013, 14:35
    #38391022
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovAnatoly MoskovskyМожет антивирус проверяет базу в первый раз?

В этом случае тормоза были бы на connect.

Необязательно если коннект (вернее то что за ним стоит) выполняется сервером асинхронно.
Как на самом деле - не знаю.

Dimitry SibiryakovQt драйвер для Firebird вообще известен своей кривизной.
Про кривизну драйвера - не буду спорить :)
...
Рейтинг: 0 / 0
09.09.2013, 17:47
    #38391348
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaА как на счет Qt SQL driver for Firebird with IBPP library
qtfirebirdibppsqldriver?
На него жалоб вроде бы как не было.

Anatoly MoskovskyНеобязательно если коннект (вернее то что за ним стоит)
выполняется сервером асинхронно.
Как на самом деле - не знаю.
Как оно на самом деле в сервере - я знаю. А вот Qt драйвер - тёмная лошадка.

А вообще-то при такой длинной задержке это всё должно тривиально проверяться с помощью
штатного Firebird-овского isql. Если он ведёт себя так же - нужно копать сервер. Работает
нормально - приложение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.09.2013, 17:56
    #38391360
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
А вы знаете что на Qt можно писать вообще без использования QSQL модуля и без этих кривых драйверов. Вся мощь ODBC или какой-нибудь native library к вашим услугам.
...
Рейтинг: 0 / 0
09.09.2013, 23:08
    #38391579
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
White OwlА вы знаете что на Qt можно писать вообще без использования QSQL модуля и без этих кривых драйверов. Вся мощь ODBC или какой-нибудь native library к вашим услугам.Спасибо за рекомендацию.

Я посмотрел, что в виндовой Qt 4.8.1 драйвер QODBC также нужно было собирать, и решил собрать QIBASE. Все заработало и ничего кроме fb не пришлось на машину ставить. Мне ничего другого не требовалось. Но вот наткнулся на такую проблему.

У меня пока нет доступа к той машине, где приложение работает. Проверю теорию с антивирусом. Если не поможет, подумаю, чем воспользоваться ODBC или qtfirebirdibppsqldriver. Мне нужно, что бы и под виндой и под линухом одинаково работало.

А можно ссылку на то как работать с ODBC без QtSql?
...
Рейтинг: 0 / 0
09.09.2013, 23:13
    #38391582
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaА можно ссылку на то как работать с ODBC без QtSql?
С ODBC работать так:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx
С Firebird работать так: http://www.ibphoenix.com/files/60ApiGuide.zip
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.09.2013, 23:21
    #38391588
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovagodaА как на счет Qt SQL driver for Firebird with IBPP library
qtfirebirdibppsqldriver?
На него жалоб вроде бы как не было.Попробую, если отключение антивируса не поможет.
Dimitry SibiryakovА вообще-то при такой длинной задержке это всё должно тривиально проверяться с помощью
штатного Firebird-овского isql. Если он ведёт себя так же - нужно копать сервер. Работает
нормально - приложение.


Дело в том, что такая задержка выскакивает не постоянно. Обычно при первом доступе после перезагрузки компа, но не всегда. У меня этот запрос выполняется в цикле и занимает до десяти миллисекунд. И только иногда такое происходит. В принципе подождать и дальше все работает. Но когда ждать нужно до пяти минут закрадывается сомнение, и люди нервничают.

В общем я isql-ем пробовал у меня такой длительности не получалось но учитывая что у меня и в приложении это происходит не часто я не могу быть уверенным.

Жаль, сегодня не получилось добраться до машины с приложением, очень хочется, что бы это был антивирус.
...
Рейтинг: 0 / 0
09.09.2013, 23:34
    #38391594
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovagodaА можно ссылку на то как работать с ODBC без QtSql?
С ODBC работать так:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx
С Firebird работать так: http://www.ibphoenix.com/files/60ApiGuide.zip
Спасибо, посмотрел. Чтобы не сильно менять уже готовое приложение придется написать свой врапер с интерфейсами, как у QSql. Или предстоит крутой рефакторинг.

Если отключение антивируса не поможет, сразу попробую qtfirebirdibppsqldriver. Если там все плохо буду пробовать… :(

Спасибо за то, что осветили путь.
...
Рейтинг: 0 / 0
09.09.2013, 23:56
    #38391600
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaDimitry Sibiryakovпропущено...

На него жалоб вроде бы как не было.Попробую, если отключение антивируса не поможет.
Dimitry SibiryakovА вообще-то при такой длинной задержке это всё должно тривиально проверяться с помощью
штатного Firebird-овского isql. Если он ведёт себя так же - нужно копать сервер. Работает
нормально - приложение.


Дело в том, что такая задержка выскакивает не постоянно. Обычно при первом доступе после перезагрузки компа, но не всегда. У меня этот запрос выполняется в цикле и занимает до десяти миллисекунд. И только иногда такое происходит. В принципе подождать и дальше все работает. Но когда ждать нужно до пяти минут закрадывается сомнение, и люди нервничают.

В общем я isql-ем пробовал у меня такой длительности не получалось но учитывая что у меня и в приложении это происходит не часто я не могу быть уверенным.

Жаль, сегодня не получилось добраться до машины с приложением, очень хочется, что бы это был антивирус.


Так может это банально кэш набивается ...
Кэш субд.
...
Рейтинг: 0 / 0
09.09.2013, 23:57
    #38391601
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaDimitry Sibiryakovпропущено...

С ODBC работать так:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx
С Firebird работать так: http://www.ibphoenix.com/files/60ApiGuide.zip
Спасибо, посмотрел. Чтобы не сильно менять уже готовое приложение придется написать свой врапер с интерфейсами, как у QSql. Или предстоит крутой рефакторинг.

Если отключение антивируса не поможет, сразу попробую qtfirebirdibppsqldriver. Если там все плохо буду пробовать… :(

Спасибо за то, что осветили путь.

Не делай ничего, пока не выяснишь причину.
...
Рейтинг: 0 / 0
10.09.2013, 00:00
    #38391603
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
MasterZivТак может это банально кэш набивается ...
Кэш субд.
Он набивается при execute, не при fetch.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2013, 09:50
    #38391756
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
MasterZivagodaпропущено...
Попробую, если отключение антивируса не поможет.
пропущено...


Дело в том, что такая задержка выскакивает не постоянно. Обычно при первом доступе после перезагрузки компа, но не всегда. У меня этот запрос выполняется в цикле и занимает до десяти миллисекунд. И только иногда такое происходит. В принципе подождать и дальше все работает. Но когда ждать нужно до пяти минут закрадывается сомнение, и люди нервничают.

В общем я isql-ем пробовал у меня такой длительности не получалось но учитывая что у меня и в приложении это происходит не часто я не могу быть уверенным.

Жаль, сегодня не получилось добраться до машины с приложением, очень хочется, что бы это был антивирус.


Так может это банально кэш набивается ...
Кэш субд.А как это проверить?
Да и иногда запрос не возвращает ни одной записи, а тормоза все равно присутствуют. Хуже то, что та машина, где это проявляется, у заказчика и географически далеко расположена. И перегружать ее часто не желательно. А у меня на машине этого глюка я не наблюдал.
Спасибо за советы. Я теперь хоть знаю, куда смотреть в случае чего. Переделывать, конечно, сразу не буду бросаться. Как че узнаю, сюда напишу, чем дело закончилось.
...
Рейтинг: 0 / 0
10.09.2013, 13:31
    #38392154
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
agodaмашина, где это проявляется, у заказчика и географически далеко расположена. И
перегружать ее часто не желательно. А у меня на машине этого глюка я не наблюдал.

Тогда вопрос на засыпку: а ты действительно абсолютно уверен, что тормозит именно вызов
next?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2013, 13:41
    #38392161
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry Sibiryakov,

Со слов бухгалтера :)
...
Рейтинг: 0 / 0
10.09.2013, 14:10
    #38392234
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry SibiryakovMasterZivТак может это банально кэш набивается ...
Кэш субд.
Он набивается при execute, не при fetch.


Это ни ты, ни я не знаем, когда он набивается.
Но я тебе точно скажу, на 100%, fetch тоже может помещать данные в кэш. И если напр. ты не вызовешь лишний раз fetch, кэш останется нетронутым.
...
Рейтинг: 0 / 0
10.09.2013, 14:27
    #38392274
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
MasterZivЭто ни ты, ни я не знаем, когда он набивается.
Мы говорим не о MS SQL, а о Firebird, не забывай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.09.2013, 15:37
    #38392416
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Dimitry Sibiryakovagodaмашина, где это проявляется, у заказчика и географически далеко расположена. И
перегружать ее часто не желательно. А у меня на машине этого глюка я не наблюдал.

Тогда вопрос на засыпку: а ты действительно абсолютно уверен, что тормозит именно вызов
next?..
Уверен, у меня есть лог, в котором записаны времена выполнения каждой функции.
...
Рейтинг: 0 / 0
10.09.2013, 15:43
    #38392433
agoda
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QSqlQuery + Firebird длительное ожидание ответа на query->next()
Anatoly MoskovskyDimitry Sibiryakov,

Со слов бухгалтера :):)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / QSqlQuery + Firebird длительное ожидание ответа на query->next() / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]