【问题标题】:SQLITE ODBC driver and database lockingSQLITE ODBC 驱动程序和数据库锁定
【发布时间】:2017-12-29 08:47:57
【问题描述】:

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

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

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

【问题讨论】:

  • Altium 可能会保持锁定以防止其他应用程序(如您的应用程序)修改文件。
  • 这就是我的怀疑。我想知道是否有办法在 ODBC 驱动程序本身中防止这种情况发生。它与 MS Access 一起正常工作。但这并不能说明什么。
  • Altium 不太可能使用 ODBC 驱动程序。
  • Altium 工作正常。问题是我无法在不关闭 Altium 的情况下在 Altium 之外编辑数据。如果我不需要在 Altium 打开的情况下添加/更新部件,那将不是问题。直到开发人员修改 Altium 以在它不使用数据库时释放它的锁定,这对于 SQLITE 来说似乎是不可能的。

标签: sqlite locking odbc altium-designer


【解决方案1】:

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

启用Write Ahead Logging风格的数据库日志

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

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

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

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

DB Browser Database Settings

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

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

使用替代的 ODBC 驱动程序

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

结论

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多