У меня проблема ROOM, я пишу и читаю одновременно, и во время записи часть чтения блокируется или очень медленно работает.
Вот моя архитектура:
- Все операции дискового ввода-вывода выполняются в однопоточном исполнителе.
- Один работник для синхронизации данных (запись)
- Одна операция для отображения данных пользователю (данные извлекаются из комнаты, если они есть, в противном случае создаются пустые представления (TextView, Radio, CheckBox, DropDown и т. Д.))
Если синхронизация отсутствует, напрямую отображается Активность с данными из БД, если они есть.
Если выполняется синхронизация с большим количеством записей, действие будет слишком длинным для отображения (от 20 до 60 секунд).
Я установил режим журнала на RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING
, но все тот же.
Подведем итог:
- Активность -> Сервис -> БД
- Без синхронизации: результат напрямую
- В процессе синхронизации: строка ниже заблокирована из класса обслуживания.
// Ниже исполнитель выполняет чтение DISK из комнаты. Но так как есть некоторые записи, он заблокирован ... Не знаю почему ..
Executors.newSingleThreadExecutor().execute {// DISK READING....}
Пишущая часть выполняется с несколькими потоками, рабочий вызывает сетевой сервис с этим Executors.newFixedThreadPool(3)
,
и сетевой результат передается другому сервису (diskIO) для обработки и сохранения данных в комнате.
Есть ли какие-либо ограничения для чтения и записи в БД? Я имею в виду, если есть слишком много потоков, это может быть проблемой? (Я пробовал один поток для сети и базы данных, но все та же проблема ..)