C ++ / SQLite - доступ к базе данных с несколькими процессами - PullRequest
4 голосов
/ 04 сентября 2011

Я хотел бы написать с несколькими процессами в базе данных SQLite. Вот мой код на C ++:

stringstream sstream << "BEGIN;" << query << "COMMIT;";

sqlite3_busy_timeout(databasePtr, 60000); // set timeout if sql busy

if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){
    /** ERROR or SQLITE_BUSY **/
}    

sqlite3_busy_timeout(databasePtr, 0); // reset sql_busy handler

Я думал, что sqlite3_busy_timeout приводит к успеху. Но я проверил результаты и обнаружил, что не все данные записываются в базу данных. Где моя ошибка?

Кто-нибудь знает, как часто вызывается sqlite3_exec, когда для sqlite3_busy_timeout установлено значение 60000 (мс)? Или после 60000 (мс) будет только один вызов, если первая попытка вернется с SQLITE_BUSY?

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

do{
    if((result = sqlite3_exec(databasePtr, (sstream.str()).c_str(), NULL, NULL, NULL)) != SQLITE_OK){
        if(result == SQLITE_BUSY){
            sleep(60000); // sleep 10 sec
        }else{
            /** ERROR **/
        }
    }
}while(result == SQLITE_BUSY);

1 Ответ

2 голосов
/ 04 сентября 2011

Обработчик занятости по умолчанию, установленный sqlite3_busy_timeout (sqliteDefaultBusyCallback () в src / main.c), спит в течение 1 мс, а затем пытается снова, затем в течение 2 мс, 5 мс ... пока общее время ожидания не превысит указанное вами значение времени ожидания.

Таким образом, ваше исправление по сути копирует то, что делается внутри, но с необычно большим временем ожидания (аргумент sleep () указывается в секундах, поэтому ваш код спит около 18 часов).Кстати, даже 60000 мс = 60 с кажутся слишком большими для тайм-аута, как в sqlite3_busy_timeout, не говоря уже о времени задержки между повторными попытками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...