Считывание базы данных комнаты заблокировано во время записи. (Читай и пиши одновременно) - PullRequest
0 голосов
/ 08 января 2019

У меня проблема ROOM, я пишу и читаю одновременно, и во время записи часть чтения блокируется или очень медленно работает.

Вот моя архитектура:

  • Все операции дискового ввода-вывода выполняются в однопоточном исполнителе.
  • Один работник для синхронизации данных (запись)
  • Одна операция для отображения данных пользователю (данные извлекаются из комнаты, если они есть, в противном случае создаются пустые представления (TextView, Radio, CheckBox, DropDown и т. Д.))

Если синхронизация отсутствует, напрямую отображается Активность с данными из БД, если они есть. Если выполняется синхронизация с большим количеством записей, действие будет слишком длинным для отображения (от 20 до 60 секунд).

Я установил режим журнала на RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING, но все тот же.

Подведем итог:

  • Активность -> Сервис -> БД
  • Без синхронизации: результат напрямую
  • В процессе синхронизации: строка ниже заблокирована из класса обслуживания.

// Ниже исполнитель выполняет чтение DISK из комнаты. Но так как есть некоторые записи, он заблокирован ... Не знаю почему ..

Executors.newSingleThreadExecutor().execute {// DISK READING....}

Пишущая часть выполняется с несколькими потоками, рабочий вызывает сетевой сервис с этим Executors.newFixedThreadPool(3), и сетевой результат передается другому сервису (diskIO) для обработки и сохранения данных в комнате.

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

...