У меня есть система, которая работает как конвейер данных, где непрерывные данные откуда-то поступают удаленно, и мне нужно отправить их в другое удаленное место назначения. Иногда пункт назначения может быть недоступен или может быть отключен, поэтому мне необходимо временно сохранить поток данных (при запуске и при сбое питания). В настоящее время я пытаюсь использовать SQLite в качестве средства для сохранения этих данных.
Теперь возникает проблема - данные могут не поступать последовательно, и с моей стороны также проводится небольшой анализ для фильтрации некоторых данныхвне. Данные сохраняются в базе данных параллельно, и если место назначения достижимо, я бы также попытался извлечь (хотя и последовательно здесь) одновременно в качестве входного потока. Когда я пытаюсь использовать режим WAL
, я часто получаю ошибку SQLITE_BUSY
или SQLITE_BUSY_RECOVERY
. Я использую System.Data.SQLite
ADO.NET провайдера.
Я попытался использовать семафор, который заставил мое приложение последовательно обращаться к базе данных SQLite, и я больше не вижу ошибку. Тем не менее, скорость кажется низкой - до такой степени, что я не думаю, что она работает для моей производственной среды.
Я также пытался установить безумно занятые таймауты, но, похоже, ничего не делает вall.
Я также пытался отловить для SQLiteException
, но исключение не удалось отловить (даже когда я заставил мой отладчик разбивать все типы исключений) - он просто просто печатает ошибку на моей консоли. Это сделало невозможным для меня повторить любой неудачный запрос, когда это произойдет. Редактировать: только ошибки 11 и 261 не приводят к возникновению исключения.
Чтение документации для WAL (точка 9), я испытываю искушениедогадаться, что я установил другое соединение во время очистки базы данных? Одна вещь, которая озадачивает меня - почему база данных делает восстановление там (что вызвало ошибку 261)?
Любой совет будет оценен.