SQLite VACUUM в параллельном потоке

Попробуйте оптимизировать работу базы данных моего приложения.

Во время синхронизации базы данных мое приложение запускает большой пакет команд "удалить" и "вставить" внутри одной транзакции. После приложения "COMMIT" транзакции выполните команду "VACUUM". VACUUM работает отлично, но иногда это занимает много времени. Поэтому я решил перенести выполнение 'VACUUM' в параллельный поток. И здесь происходит что-то не так. В другой теме я получаю "база данных заблокирована".

Что я делаю:

1.Закройте базу данных после успешного "COMMIT".

2. Запустите отдельный метод, который снова открывает и закрывает базу данных с помощью 'VACUUM'.

В том же потоке 'COMMIT' 'VACUUM' работает нормально, но в отдельном потоке тот же метод вызывает ошибку "база данных заблокирована". Я определенно могу сказать, что никакой другой процесс не работает с закрытой базой данных, поскольку синхронизация базы данных является логически отдельным процессом приложения.

Что я делаю не так?

    [connection closeDb];
    [connection release];

    if(!rollBackTransaction && commitSuccess){
// The commented code block doesn't work - "database is locked" error
//        NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(runVacuumForDataBase:) object:_dbFileName];
//        [thread start];
        [self runVacuumForDataBase:_dbFileName]; // <-- This works fine
    }

1 ответ

Вы можете получить доступ к базе данных SQLite только из одного потока одновременно. Выполнение VACUUM в другом потоке не сработает в вашем случае, вам придется подождать, пока не завершится первая транзакция. Удачи!

РЕДАКТИРОВАТЬ Я столкнулся с той же проблемой, что и вы, при использовании многопоточной среды. В итоге я использовал очередь отправки для базы данных SQLite, где все транзакции в базу данных выполняются синхронно. Я настоятельно рекомендую перенести все ваши требования в базу данных в другой поток (вторичный, а не основной).

Другие вопросы по тегам