Russian Qt Forum

Qt => Базы данных => Тема начата: vregess от Декабрь 29, 2014, 12:33



Название: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Декабрь 29, 2014, 12:33
После подключения к локальной БД программа завершается очень долго - несколько секунд.
qt 5.2.0, msvc 2010 x32, win7

Пробовал такие варианты:
* firebird 2.5.2, самосборный (чтобы использовать ICU51, как в qt)
* firebird 2.5.3, самосборный
* firebird 2.5.3, готовые библиотеки с сайта.

ibase драйвер собирался для каждой версии.
Даже если не подключатся к БД, а просто загрузить ibase драйвер, то завершается программа заметно медленнее, чем без драйвера.

main.cpp
Код
C++ (Qt)
#include <QApplication>
#include <QSqlDatabase>
#include <QFileInfo>
#include <QDir>
#include <QMessageBox>
#include <QTimer>
 
void run()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE", "myconnection1");
   if (!db.isValid())
   {
       QMessageBox::information(0, "msg", "fail");
       return;
   }
 
   QString path = QFileInfo(
       QApplication::applicationDirPath(), QString("test.fdb"))
       .absoluteFilePath();
 
   QString cfg = QLatin1String(
       "server type=Embedded; auto_commit=True; auto_commit_level=4096; "
       "connection lifetime=1; ISC_DPB_LC_CTYPE=UTF8; DataBase=\"%1\"");
 
   db.setUserName("SYSDBA");
   db.setPassword("masterkey");
   db.setConnectOptions(cfg.arg(path));
   db.setDatabaseName(path);
 
   if (!db.open())
   {
       QMessageBox::information(0, "msg", "db open fail");
       return;
   }
 
   QMessageBox::information(0, "msg", "ok");
}
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   run();
   QTimer::singleShot(0, &app, SLOT(quit()));
   return app.exec();
}
 

pro
Цитировать
TEMPLATE = app
QT += sql widgets
SOURCES += main.cpp

В чем может быть проблема? Или это нормальное поведение?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: panAlexey от Декабрь 29, 2014, 15:08
Тоже интересно.


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Март 26, 2015, 10:09
Up.
Кто-нибудь решил проблему? Может с другим драйвером таких проблем нет?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Март 26, 2015, 12:23
Проверил с raw C API - программа также завершается несколько секунд. Похоже проблема не на стороне Qt, а где-то у firebird, и связанно это именно с ebedded версией. Тот же FlameRobin нормально завершается.

Вот тут похожая проблема http://stackoverflow.com/questions/1512944/embedded-firebird-unload-delay (http://stackoverflow.com/questions/1512944/embedded-firebird-unload-delay), но я никаких событий не использую.
Тестовый код:
Код
C++ (Qt)
#include <iostream>
#include <ibase.h>
 
#define ERR_STATUS {res = 1; isc_print_status(status);}
 
isc_db_handle   db = NULL;
isc_tr_handle   trans = NULL;
ISC_STATUS_ARRAY status;
 
int main(int argc, char **argv)
{
   int res = 0;
 
   std::cout << "start" << std::endl;
 
   if (isc_attach_database(status, 0, "test.fdb", &db, 0, NULL))
   {
       isc_print_status(status);
       return 1;
   }
 
   if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
       ERR_STATUS
 
   if (isc_dsql_execute_immediate(status, &db, &trans, 0,
       "CREATE TABLE TEST(id INT)", 1, NULL))
       ERR_STATUS
 
   if (isc_commit_transaction(status, &trans))
       ERR_STATUS
 
   if (isc_detach_database(status, &db))
       ERR_STATUS
 
   std::cout << "end" << std::endl;
   return res;
}
 


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: Bepec от Март 26, 2015, 12:33
Принудительно базу закрывать пробовали?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Март 26, 2015, 12:34
Пробовали.


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vlad-mal от Февраль 15, 2016, 03:17
Решение.
Перед выгрзкой клиентской библиотеки (речь именно об embedded) следует вызвать функци. fb_shutdown этой самой библиотеки. С параметрами (0, 1) /например/.

Сигнатура функции:


   int fb_shutdown(unsigned int timeout,
                   const int reason);

stdcall, а еще следует указать имя dll.


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Февраль 15, 2016, 06:26
Жалко, уже не проверить - заменил на sqlite (пришлось помудохаться с многопоточностью). При возможности проверю, спасибо.


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: panAlexey от Февраль 15, 2016, 14:08
Мерси!


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: Пытон от Февраль 13, 2017, 08:00
Жалко, уже не проверить - заменил на sqlite (пришлось помудохаться с многопоточностью). При возможности проверю, спасибо.

Как вы там живёте на SQLite без decimal?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Февраль 13, 2017, 08:59
Как вы там живёте на SQLite без decimal?

Нормально живем, более того мы еще и без SQLite можем жить, если ты понимаешь о чем я.


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: Пытон от Февраль 13, 2017, 11:20
Как вы там живёте на SQLite без decimal?

Нормально живем, более того мы еще и без SQLite можем жить, если ты понимаешь о чем я.

Денюжки (числа с фиксированной дробной частью) в sqlite не хранишь?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Февраль 13, 2017, 11:29
Денюжки

Да


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: Пытон от Февраль 13, 2017, 11:35
Что - да? Да, не храню? Или - да, храню?


Название: Re: Qt + Firebird embedded, долгое завершение программы.
Отправлено: vregess от Февраль 13, 2017, 13:06
Что - да? Да, не храню? Или - да, храню?

Да, не храню.