1

我从http://ch-werner.de/sqliteodbc/下载并安装了 SQLite ODBC 驱动程序。在一个问题上效果很好。如果另一个应用程序打开了数据库,我似乎无法获得排他锁。

我正在使用一个名为 Altium 的 CAD 应用程序。我正在尝试在 SQLITE 中构建一个原型零件数据库来存放数据。我安装了上面提到的 ODBC 驱动程序,我可以很好地获取数据。问题是,如果我尝试在 SQLITEStudio 或 DB Browser for SQLITE 之类的应用程序中打开同一个数据库,我永远无法获得独占锁来写入新记录。Altium 从不关闭它的连接,我不知道这是否是问题所在。

当我阅读https://www.sqlite.org/lockingv3.html时,它似乎表明多个进程需要进行通信才能获得独占锁(写入所必需的)。这让我相信我的问题是第一个应用程序永远不会释放它的共享锁,因此第二个应用程序永远无法获得独占锁。我是否正确解释了这一点?

4

1 回答 1

1

我在使用 SQLite 作为 Altium 数据库时遇到了同样的困难。当 Altium 打开并创建了与数据库的连接时,无法更新数据库文件。到目前为止,我发现了两种解决方法:

启用预写日志样式数据库日志

默认数据库日志样式 DELETE 会临时创建数据库副本,写入数据库文件,并在验证写入后删除临时副本。

预写日志记录 WAL 将所有更改放在一个临时文件中,同时保留数据库的原始副本。访问数据库的进程解析数据库文件和 WAL 临时文件,并返回反映所有更改的信息。我可以确认在 Altium 中进行数据库刷新时可以看到 Altium 之外的写入。

当检查点操作发生时,存储在 WAL 文件中的写入将写入原始数据库。在进程调用时PRAGMA wal_checkpoint;或在 WAL Auto Checkpoint 设置指定的许多操作之后。

您可以在DB Browser的 Edit Pragmas 选项卡中启用 WAL 日志模式:

数据库浏览器数据库设置

不过,问题仍然没有解决。Altium 打开时,检查点数据库不起作用。数据库文件仍处于锁定状态,无法更改。

需要注意的是,我们希望在 Git 中备份和维护数据库文件的历史记录(是的,不推荐使用 Git)。在 Git 中不会跟踪对日志文件的写入,在检查点之前不会看到数据库文件中的更改。这意味着我们不能在 Altium 打开时从 Git 推送或拉取。我们可以跟踪数据库和日志文件,但另一个结果是没有数据更改的简单检查点将被 Git 视为更改。

使用替代的 ODBC 驱动程序

我测试了一个来自 devart的替代专有ODBC 驱动程序。当我将 Altium 配置为使用 devart 驱动程序连接到 SQLite 数据库时,无论日志设置如何,DB Browser 在 Altium 打开时写入文件都没有问题。Altium 还可以通过刷新操作查看这些更改。

结论

Christian Werner 的ODBC 驱动程序(从 0.9996 版开始)以 devart 驱动程序没有的方式锁定文件,即使 Atlium 通过驱动程序保持与数据库的连接。在某些情况下,WAL 日志模式可能是一种解决方法。

于 2019-11-25T14:21:41.847 回答