Как обрабатывать одновременный доступ в Spatialite? - PullRequest
0 голосов
/ 27 января 2020

Я разрабатываю приложение Android Map, в котором я использую Spatialite. Мне нужно реализовать синхронизацию . Клиент хочет, чтобы приложение также работало в автономном режиме (если не может достичь inte rnet), но также хочет видеть любые изменения на сервере, которые приложение внесло, как можно скорее. Поэтому я сохраняю изменения в телефоне (например, новые POI, добавленные на карту), затем начинаю загружать данные на сервер. Но, возможно, пользователь хочет добавить еще одну POI. Итак, 2 потока будут использовать базу данных: syn c и карту. Оба будут использовать чтение и запись.

Я попробовал, что делает Spatialite, когда я использую 2 потока для записи в одно и то же соединение с базой данных. Я создал транзакцию вставки, обе вставки по 1000 строк. Результаты: первый поток начинает транзакцию. Второй поток генерирует исключение: jsqlite.Exception: не может начать транзакцию внутри транзакции . Тогда оба потока вставки работают асинхронно. В конце, thread1 commit успешен. 2 потока выбрасывает: jsqlite. Исключение: невозможно зафиксировать - ни одна транзакция не активна .

Для sqlite существует класс SQLiteOpenHelper , который управляет транзакциями. Результаты теста те же: поток1 запускается и выполняет транзакцию. Когда это закончено, thread2 запускается и выполняется успешно. Я хочу то же самое для моего Spatialite. Есть ли решение для этого где-нибудь, или мне нужно написать его самостоятельно?

...