SQLite:创建现有连接以重新加载数据库

时间:2015-04-08 05:31:38

标签: database sqlite

我正在维护遗留代码,其中我们有 TempDB FullDB ,TempDB只是FullDB的一个小实例,因此用户可以浏览而FullDB是的准备。

由于FullDB中涉及大量写入操作,因此在同一数据库文件上进行读取和写入会为其他线程上的读者创建锁定。所以我正在考虑以下策略,这种策略最适合我们的情况,万一它可能。

这就是我想要做的事情:

  1. 开始准备数据库,当达到tempDB的阈值时,提交事务并关闭连接。使用此文件的副本,让我们调用它们orig(这是临时数据库)和{{1} }(这是临时数据库的副本,将对此文件进行进一步写入)。
  2. 接下来,读者可以在收到活动后立即在copy上打开连接。 Writer将在orig上打开一个连接并在很长一段时间内执行剩余的写入,在此期间读者正在使用copy临时数据库。
  3. 当编写者准备好完整的数据库orig时,我需要将copy文件替换为更新的完整数据库orig
  4. 这是捕获,读者不会关闭并重新打开连接。所以当我更换数据库时,我需要阻止读者。这可以通过在copy数据库上获取EXCLUSIVE锁来实现,然后我可以用orig db(重命名)替换orig数据库。
  5. 问题: 读者不接受新的DB文件。我怎样才能让他们这样做? 我的意思是当我尝试通过终端:创建一个数据库,复制它并在副本中创建一些条目,然后用副本替换原始数据,我仍然得到原始数据库中存在的条目。令人惊讶的是,即使我删除了(原始和复制)数据库文件,我仍然得到条目。似乎SQLite从一些内存中而不是从磁盘文件中挑选数据。

    任何帮助?

    PS:在搜索时我找到了一个名为copy的命令,但不知道它是如何工作的,或者它是否真的有用。

    修改 this我想要的是什么?

1 个答案:

答案 0 :(得分:1)

当有一些打开的连接时,您不能重命名或删除数据库文件;在基于Unix的系统上,任何打开的句柄仍然可以访问旧文件。

使用(独占)锁定数据库,您可以保留文件,但删除其所有内容,并将新数据复制到其中。