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, где все транзакции в базу данных выполняются синхронно. Я настоятельно рекомендую перенести все ваши требования в базу данных в другой поток (вторичный, а не основной).