2011-02-18 48 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