Драйвер 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 может быть обходным решением в некоторых ситуациях.

Другие вопросы по тегам