Используйте SQLiteConnection и SQLiteAsyncConnection вместе - PullRequest
0 голосов
/ 04 февраля 2020

Учитывая

Я использую SQLite- Net Пакет NuGet.
У меня есть старый синхронный API для манипуляций с базой данных (SQLiteConnection).

Что Мне нужно

Я хочу использовать новый асинхронный API для манипуляций с базой данных (SQLiteAsyncConnection)

Проблема

Старый синхронный API достаточно велик, поэтому я не могу выполнить быструю миграцию в asyn c API, поэтому мне нужно использовать как синхронный, так и асинхронный API вместе, используя один файл базы данных, например:

var database = new SQLiteConnection(connectionString); // Synchronous API
var databaseAsync = new SQLiteAsyncConnection(connectionString); // Asynchronous API

Если я попытаюсь использовать два соединения в одном файле базы данных, как указано выше, я проблемы с syn c, такие как создание таблицы с использованием синхронного соединения, не делает таблицу доступной через асинхронное соединение. Я предполагаю, что внутри соединения есть какой-то внутренний кеш или что-то еще ...

Вопрос

Как правильно использовать один файл базы данных и два (syn c и asyn c) соединения вместе ?
И .. можно ли?

Дополнительная информация

  • Синхронный и асинхронный API будут полностью покрыты блокировками. Поэтому я не ожидаю конфликтов с использованием обоих API.

1 Ответ

1 голос
/ 04 февраля 2020

Несколько процессов SQLite могут одновременно иметь доступ к базе данных.

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

Ваша проблема "вне синхронизации c", вероятно, связана с тем, что опция Запись впереди по умолчанию отключена.

Чтобы активировать ее, просто добавьте следующий сегмент к вашей строке подключения:

;PRAGMA journal_mode=WAL;

Это должно позволить одновременный доступ для чтения и записи при медленном переходе к новому асинхронному API.

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

PRAGMA cache=shared
...