Поиск:

Ответ в темуСоздание новой темы Создание опроса
> database is locked Unable to fetch row SQLite, как разрулить проблему блокировки БД 
V
    Опции темы
Lindemann66
  Дата 7.10.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



Всем привет!

Следующая проблема
Программа, аналог UpdateScannera'a в FireFox
Цель - сканировать сайты на предмет наличия новых ссылок
Допустим, добавили 10 сайтов, и в начальный момент времени все они запускаются на анализ и в базу добавляется порядка 300 ссылок по каждому сайту, притом - параллельно и с использованием транзакций для усорения работы
Итого порядка 3000 - 4000 вставок по 300-400 параллельных

Как следует из сабжа, бд - SQLite

Проблема - БД, судя по всему блокируется на время транзакции, и прога выкидывает ошибку: database is locked Unable to fetch row
Собственно, такая ошибка может появляться и при каких-то других случаях, суть в том, что база лочится, и это ведёт к ошибке

Вопрос
Как обойти эту проблему, какие варианты решения Вы знаете?
P.S. Пробовал
Код

    db.setConnectOptions("QSQLITE_BUSY_TIMEOUT=10000");

    //===================

    QSqlQuery query(db);
    if (!query.exec("PRAGMA locking_mode = exclusive")) {
        QMessageBox::warning(0, "Error", query.lastError().text());
    }
    if (!query.exec("PRAGMA synchronous = off")) {
        QMessageBox::warning(0, "Error", query.lastError().text());
    }
    if (!query.exec("PRAGMA temp_store = MEMORY")) {
        QMessageBox::warning(0, "Error", query.lastError().text());
    }
    if (!query.exec("PRAGMA journal_mode = off")) {
        QMessageBox::warning(0, "Error", query.lastError().text());
    }
 - бесполезно

Буду благодарен за любые советы!
--------------------
stay true
PM MAIL WWW ICQ   Вверх
borisbn
Дата 7.10.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Lindemann66 @  7.10.2011,  10:40 Найти цитируемый пост)
параллельно и с использованием транзакций для усорения работыИтого порядка 3000 - 4000 вставок по 300-400 параллельных

300-400 одновременных транзакций на sqlite  smile 
Я бы очень удивился, если это работало


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Lindemann66
Дата 7.10.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinking...
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.8.2011
Где: Ульяновск

Репутация: нет
Всего: нет



В-общем, использую такое временное решение )
Вы удивитесь)
Итааак.....
Код

if (!query.exec()) {
    errorMessage(query.lastError().text() + "\nGetViewsByUrl:1");
    while (query.exec() == false) {}
}


Смысл: если запрос не выполняется сразу, пишем сообщение об ошибке в лог файл функцией errorMessage, и запускаем выполнение команды до тех пор, пока она не выполнится (в нашем случае она будет пытаться выполняться до тех пор, пока база не разлочится)
Такой вот аналог мутексовsmile
Если вдруг будет допущена ошибка в SQL запросе - мы узнаем об этом через лог
--------------------
stay true
PM MAIL WWW ICQ   Вверх
borisbn
Дата 7.10.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Lindemann66, в твоём случае лучше использовать одну транзакцию, а делать commit раз в 100 (или лучше в config.commitCount()) записей.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0393 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.