2011-02-18 105 views
3

我最近已将我的应用程序的工作区文件格式转换为sqlite。为了确保在NFS上的强大操作,我使用了通用更新策略,对存储在本地硬盘上临时位置的副本进行了所有修改。只有在保存时,我才能通过使用临时文件复制原始文件来修改原始文件(可能位于NFS上)。我只打开原始文件以保持独占锁定,以便其他人试图打开它们将被警告其他人正在使用它。如何确保与sqlite和NFS安全的文件同步

问题是这样的:当我将我的临时文件保存回原始文件时,我必须释放原始文件上的锁定,这为其他人提供了一个窗口,可以让原始文件尽管很小窗口。

我能想到的围绕这几个方面:

(1)是简单地通过使用SQL,对原,vacumm原即降表转储临时的内容的原单,从临时选择并插入原始。我不喜欢在存储在NFS上的sqlite文件上执行sql操作。这让我害怕腐败问题。我是否有权这样思考? (2)使用各种额外的文件充当防范,以防止其他人在复制原始文件时进入其他文件。充其量,使用文件作为互斥体存在问题。如果应用程序崩溃,我也不喜欢有额外的文件闲逛的想法。

我想知道是否有人对此有任何不同的解决方案。再次将临时文件复制到原始文件上,同时确保其他应用程序不会偷偷进入并抓取原始文件?

我使用的python2.5,SQLAlchemy的0.6.6和SQLite 3.6.20

感谢, 院长

回答

1

SQLite的NFS问题是由于破缓存和锁定。如果你的进程是唯一一个在NFS上访问这个文件,那么你就没问题。

SQLite备份API旨在解决您的问题。您可以直接备份到NFS数据库或其他本地临时文件,然后复制该文件。备份API处理所有锁定和并发问题。

您可以使用APSW访问备份API或最新版本的pysqlite。 (披露:我是APSW的作者。)

+0

谢谢罗杰我不知道那个api。在阅读sqlite API文档后,我仍然有一个问题,我希望你能回答。在我的应用程序中,我用“PRAGMA main.locking_mode = EXCLUSIVE”锁定原始文件,然后复制到一个临时文件,在那里我执行所有操作。我锁定原始文件,以便在其他应用程序出现错误时向用户显示该文件正在被其他人使用。我的问题是:我是否必须释放原始文件上的锁才能开始备份?这意味着会有一个小窗口,第二个应用程序可以从第一个应用程序中潜入并锁定该文件。 – Sandstone 2011-02-24 20:11:44