crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QT SQLite и многопоточность
noneim
  опции профиля:
сообщение 8.6.2010, 14:22
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 8.6.2010
Пользователь №: 1792

Спасибо сказали: 0 раз(а)




Репутация:   0  


На данный момент есть программа, использующая подключение к БД sqlite:
Инициализация:
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(path);
    if (!db.open())
    {
        return false;
    }


Далее в разных потоках:
    QSqlQuery query = QSqlQuery(db);
    query.prepare("INSERT INTO ip_list (ip, host, vps, assigned) "
                "VALUES (?, ?, ?, ?)");
        query.addBindValue(new_ip->ip);
        query.addBindValue(new_ip->host);
        query.addBindValue(new_ip->vps);
        query.addBindValue(new_ip->assigned);
        query.exec();


Но недавно прочитал , что оказывается так нельзя делать.
Хотя вроде бы тестил и под windows и под Linux, работало без багов.
Интересует надежность такого применения, на данных момент демон нормально держит uptime несколько дней, но вдруг возникнут какие-нибудь неожиданные баги?


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 6.12.2010, 21:56
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(512es @ 1.12.2010, 6:38) *
Методом экспериментов выяснил что работать с одним соединением в двух потоках лучше
чем лучше?
Результаты тестов приведи и условия тестов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 7.12.2010, 9:12
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.12.2010, 21:56) *
чем лучше?

Лучше лишь тем, что все запросы выполнятся и ни разу не будет отказа database is locked. Вместо отказа просто поток подождёт освобождения бд.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 8.12.2010, 16:03
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


тыкс.. кажется я придумал способ получше. точнее лишь более корректный, чем шарить соединение на 2 потока.

чтобы не получать ошибку о том что бд занята можно указать значение таймаунта побольше.

db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=10000");


правда не факт что подвисший поток всётаки разлочит базу и главный поток запишет данные
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 20:52