Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2011, 11:42   #1
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
Восклицание database is locked Unable to fetch row SQLite

Всем привет!

Следующая проблема
Программа, аналог 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());
    }
- бесполезно

Буду благодарен за любые советы!
Lindemann66 вне форума Ответить с цитированием
Старый 07.10.2011, 15:59   #2
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
По умолчанию

В-общем, использую такое временное решение )
Вы удивитесь)
Итааак.....
Код:
if (!query.exec()) {
    errorMessage(query.lastError().text() + "\nGetViewsByUrl:1");
    while (query.exec() == false) {}
}
Смысл: если запрос не выполняется сразу, пишем сообщение об ошибке в лог файл функцией errorMessage, и запускаем выполнение команды до тех пор, пока она не выполнится (в нашем случае она будет пытаться выполняться до тех пор, пока база не разлочится)
Такой вот аналог мутексов
Если вдруг будет допущена ошибка в SQL запросе - мы узнаем об этом через лог
Lindemann66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают Range, Row, Table akellaukr Microsoft Office Word 3 24.05.2011 18:54
Row/Col sizing в TStringGrid megachuhancer Общие вопросы Delphi 3 11.06.2010 09:08
не работает цикл while ($row = mssql_fetch_row($result)) zvezda_t PHP 2 25.01.2010 12:33
Locked (кнопка) (VBA) warshadow Microsoft Office Excel 3 12.12.2009 15:24
DataGridView next row MAcK Общие вопросы .NET 3 10.03.2009 15:25