Драйвер SQLITE ODBC и блокировка базы данных
Я скачал и установил драйвер ODBC для SQLite с http://ch-werner.de/sqliteodbc/. Прекрасно работает с одной проблемой. Кажется, я не могу получить эксклюзивную блокировку, если в другом приложении база данных открыта.
Я использую приложение CAD под названием Altium. Я пытаюсь построить базу данных прототипов в SQLITE для размещения данных. Я установил ODBC-драйвер, указанный выше, и я могу получить данные просто отлично. Проблема в том, что если я пытаюсь открыть ту же базу данных в приложении, таком как SQLITEStudio или DB Browser для SQLITE, я никогда не получу эксклюзивную блокировку для записи новых записей. Altium никогда не закрывает соединение, и я не знаю, в этом проблема или нет.
Когда я читаю https://www.sqlite.org/lockingv3.html это, кажется, указывает на то, что нескольким процессам потребуется обмен данными, чтобы один получил эксклюзивную блокировку (необходимую для записи). Это заставляет меня поверить, что моя проблема - первое приложение, которое никогда не снимает свою общую блокировку, поэтому второе приложение никогда не сможет получить эксклюзивную блокировку. Я правильно интерпретирую это?
0 ответов
Я испытываю те же трудности с SQLite, что и с базой данных Altium. Файл базы данных не может быть обновлен, пока Altium открыт и было создано соединение с базой данных. Я нашел два обходных пути:
Enable Logging упреждающего журнал базы данных стиля
Стиль журнала базы данных по умолчанию, DELETE, создает копию базы данных, временно записывает в файл базы данных и, когда запись проверяется, удаляет временную копию.
Журнал с упреждающей записью, WAL, помещает все изменения во временный файл, оставляя только исходную копию базы данных. Процессы, обращающиеся к базе данных, анализируют файл базы данных и временные файлы WAL и возвращают информацию, отражающую все изменения. Я могу подтвердить, что записи вне Altium видны при обновлении базы данных в Altium.
Записи, хранящиеся в файле WAL, записываются в исходную базу данных, когда происходит операция контрольной точки. Либо, когда процесс вызываетPRAGMA wal_checkpoint;
или после ряда операций, указанных в настройке автоматической проверки WAL.
Вы можете включить режим журнала WAL в БД браузере"S вкладка Edit Прагмы:
Настройки базы данных браузера БД
Однако проблема все еще не решена. Контрольная точка базы данных не работает, пока Altium открыт. Файл базы данных по-прежнему заблокирован от изменений.
Предостережение для нас заключается в том, что мы хотим делать резервную копию и поддерживать историю файла базы данных в Git (да, это не рекомендуется использовать Git). Записи в файлы журнала не отслеживаются в Git, который не видит изменений в файле базы данных до тех пор, пока не будет установлена контрольная точка. Это означает, что мы не можем нажимать или извлекать из Git, пока открыт Altium. Мы могли отслеживать файлы базы данных и журнала, но другим следствием является то, что простая контрольная точка без изменений данных будет рассматриваться Git как изменение.
Используйте альтернативный драйвер ODBC
Я протестировал альтернативный проприетарный драйвер ODBC от Devart. Когда я настраиваю Altium для подключения к базе данных SQLite с помощью драйвера devart, браузер БД не имеет проблем с записью в файл, пока Altium открыт, независимо от настроек журнала. Altium также может увидеть эти изменения с помощью операции обновления.
Вывод
Драйвер ODBC Кристиана Вернера (начиная с версии 0.9996) блокирует файл способом, которого не делает драйвер devart, даже если Atlium поддерживает соединение с базой данных через драйвер. Режим журнала WAL может быть обходным решением в некоторых ситуациях.