Почему SQLite все еще не может быстро писать из нескольких потоков в сериализованном режиме? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь записывать записи в SQLite с использованием EF Core 2.2 очень быстро (1000 строк с задержкой около 20 мс), используя несколько потоков.Я получаю эту ошибку:

System.InvalidOperationException: 'Вторая операция началась в этом контексте перед завершением предыдущей операции.Обычно это вызвано тем, что разные потоки используют один и тот же экземпляр DbContext, однако члены экземпляра не гарантированно безопасны для потоков.Это также может быть вызвано тем, что вложенный запрос оценивается на клиенте, в этом случае переписать запрос, избегая вложенных вызовов. '

Я могу использовать WAL (Write Ahead Logging), который работает лучше, но все же вызываетпроблема, если я использую ручную блокировку с помощью WAL, то это работает, но мне не нравится неудобство наличия отдельных файлов, которые не сохраняются на основной базе данных в случае сбоя.Использование простой блокировки без WAL также работает, но время от времени может зависать до нескольких секунд.

Почему эта ошибка возникает, когда сборка SQLite была скомпилирована с этой конфигурацией:

COMPILER=msvc-1700
DEFAULT_FOREIGN_KEYS
ENABLE_COLUMN_METADATA
ENABLE_FTS3_PARENTHESIS
ENABLE_FTS4
ENABLE_FTS5
ENABLE_JSON1
ENABLE_RTREE
THREADSAFE=1

THREADSAFE=1 означает сериализацию в соответствии с https://www.sqlite.org/threadsafe.html, которая должна предотвращать проблемы, когда несколько потоков пытаются использовать один и тот же DbContext для записи в БД.

SQLITE_THREADSAFE = 1)библиотека SQLite сама сериализует доступ к соединениям с базой данных и подготовленным операторам, так что приложение может свободно использовать одно и то же подключение к базе данных или одно и то же подготовленное выражение в разных потоках одновременно.

Я бы хотелчтобы понять, почему это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...