2015-04-08 32 views
0

我保持遺留代碼,其中我們有的TempDBFullDB的cocept,tempdb數據庫FullDB的只是一個小例子,讓用戶可以瀏覽,同時FullDB是準備。SQLite的:使現有連接重裝數據庫

由於在FullDB中涉及大量寫入,因此在同一個數據庫文件上讀取和寫入操作正在爲其他線程上的讀取器創建鎖定。因此,我正在考慮以下策略,最適合我們的情況,以防萬一。

這就是我想做的事:

  1. 開始準備DB,達到閾值時的tempdb,提交事務並關閉connection.Make該文件的副本,讓我們稱他們爲orig(其是臨時數據庫)和copy(這是臨時數據庫的副本,並將進一步寫入該文件)。
  2. 接下來,讀者可以在收到活動後立即在orig上打開連接。編寫者將在copy上打開連接,並在讀取器使用orig臨時數據庫期間執行相當長時間的剩餘寫入操作。
  3. 當作者編寫完整的DB copy時,我需要用更新的完整db copy替換orig文件。
  4. 這裏有一個問題,讀者不會關閉並重新打開連接。所以我需要在更換數據庫時阻止閱讀器。這可以通過獲取orig DB上的EXCLUSIVE鎖來實現,然後我可以用copy db(重命名)替換orig db。

問題: 讀者不接受新的DB file.How我可以讓他們這樣做? 我的意思是當我嘗試通過終端:製作一個數據庫,複製它,並進入副本的一些條目,然後用副本替換原件,我仍然獲得原始數據庫中存在的條目。令人驚訝的是,即使我刪除了原始數據庫和複製數據庫文件,我仍然得到了條目。看起來SQLite從內存中挑選數據,而不是從磁盤文件中挑選數據。

任何幫助?

PS:在搜索時,我發現了一個叫做.open的命令,但不知道它是如何工作的,或者它是否真的有用。

編輯this我想要什麼?

回答

1

當有一些打開的連接時,您不能重命名或刪除數據庫文件;在基於Unix的系統上,任何打開的句柄仍將訪問舊文件。

通過DB上的(獨佔)鎖,您可以保留該文件,但刪除其所有內容,並將新數據複製到其中。