我正在维护遗留代码,其中我们有 TempDB 和 FullDB ,TempDB只是FullDB的一个小实例,因此用户可以浏览而FullDB是的准备。
由于FullDB中涉及大量写入操作,因此在同一数据库文件上进行读取和写入会为其他线程上的读者创建锁定。所以我正在考虑以下策略,这种策略最适合我们的情况,万一它可能。
这就是我想要做的事情:
orig
(这是临时数据库)和{{1} }(这是临时数据库的副本,将对此文件进行进一步写入)。copy
上打开连接。 Writer将在orig
上打开一个连接并在很长一段时间内执行剩余的写入,在此期间读者正在使用copy
临时数据库。orig
时,我需要将copy
文件替换为更新的完整数据库orig
。copy
数据库上获取EXCLUSIVE
锁来实现,然后我可以用orig
db(重命名)替换orig
数据库。问题: 读者不接受新的DB文件。我怎样才能让他们这样做? 我的意思是当我尝试通过终端:创建一个数据库,复制它并在副本中创建一些条目,然后用副本替换原始数据,我仍然得到原始数据库中存在的条目。令人惊讶的是,即使我删除了(原始和复制)数据库文件,我仍然得到条目。似乎SQLite从一些内存中而不是从磁盘文件中挑选数据。
任何帮助?
PS:在搜索时我找到了一个名为copy
的命令,但不知道它是如何工作的,或者它是否真的有用。
修改 this我想要的是什么?
答案 0 :(得分:1)
当有一些打开的连接时,您不能重命名或删除数据库文件;在基于Unix的系统上,任何打开的句柄仍然可以访问旧文件。
使用(独占)锁定数据库,您可以保留文件,但删除其所有内容,并将新数据复制到其中。