(Android) Ищу шаблон для управления многопоточным доступом к нескольким базам данных, которые иногда подключаются друг к другу

#android #multithreading #sqlite #sqliteopenhelper

#Android #многопоточность #sqlite #sqliteopenhelper

Вопрос:

В моем приложении, уже выпущенном для iOS, используются три отдельные базы данных. Способ работы моего приложения заключается в том, что при запуске оно обновит 2 базы данных, если какие-либо обновления будут обнаружены в отдельном потоке. Иногда он полностью заменяет файлы, а иногда просто добавляет новые записи.

В другом потоке к этим трем базам данных можно получить доступ в любое время. Это было бы нормально, за исключением того, что для некоторых запросов мне приходится объединять третью базу данных с одной из других баз данных с помощью оператора attach для выполнения сложных запросов.

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

Основным вариантом было бы создать некоторый мастер-класс базы данных, в котором все синхронизировано, но я хотел бы услышать, есть ли у кого-нибудь еще архитектура, которой они следовали для борьбы с этой ситуацией.

Комментарии:

1. Просто увеличьте время ожидания.

2. Это что-то вроде глобальной настройки или что-то в этом роде? API, которые я использую, работают через SQLiteOpenHelper, захватывают базу данных и выполняют rawQuery() ы.

3. PRAGMA busy_timeout .

4. Я все еще чувствую, что это только замаскирует проблему, а не предотвратит ее. Другой поток все еще может появиться и украсть право собственности на базу данных. Мне нужно что-то, что будет синхронно блокировать БД, в то время как другая отдельная БД выполняет к ней краткий прикрепленный запрос.

5. SQLite не поддерживает высокий уровень параллелизма . Но это звучит так, как будто архитектура вашего приложения слишком сложна.