簡體   English   中英

如何確保緩存以減少SQLite數據庫的文件系統寫入周期

[英]how we can ensure caching to reduce file-system write cycle for SQLite databases

我想在SQLite數據庫中實現緩存。 我的主要目標是將數據寫入RAM,並且當緩存已滿時,我想將所有數據刷新到磁盤數據庫。 我想知道是否有可能? 如果可能,我可以提供一些示例代碼嗎?

謝謝

SQLite已經進行了自己的緩存,這可能比您可以實現的任何緩存都要高效-您可以在此處了解有關它的接口。 您可能感興趣的其他的優化-有一個常見問題在這里

由於sqlite是事務性的,因此它依賴於fsync來確保提交事務時已完成一組特定的語句。 fsync的速度和實現因平台而異。

因此,通過在一個事務中批處理多個語句,可以大大提高速度,因為在調用fsync之前將寫入多個數據塊。

這里有一篇較老的sqlite文章說明了在內部和外部事務中執行多個INSERT之間的區別。

但是,如果編寫的應用程序需要同時訪問數據,請注意,當sqlite啟動寫入事務時,所有讀取(選擇語句)將被阻止。 您可能想探索在進行寫入事務時如何使用內存中的緩存來檢索數據。

話雖如此,sqlite的緩存方案也有可能為您解決這個問題。

為什么要這樣做? 您是否遇到性能問題? 還是要在將數據提交到磁盤之前阻止其他連接看到數據?

關於同步到磁盤,數據庫完整性和速度之間需要權衡。 您要哪個取決於您的情況。

  1. 使用交易。 優點:高可靠性和簡單。 缺點:一旦開始事務,除非您執行COMMITROLLBACK ,否則其他任何人都無法寫入數據庫。 這通常是最好的解決方案。 如果您有很多工作要做,請開始事務,編寫所需的所有內容,然后COMMIT COMMIT所有更改都將緩存在RAM中,直到您COMMIT為止,這時數據庫將顯式同步到磁盤。

  2. 使用PRAGMA journal_mode=MEMORY和/或PRAGMA synchronous=OFF 優點:速度快,簡單。 缺點:數據庫不再安全以防止斷電和程序崩潰。 使用這些選項,您可能會丟失整個數據庫 但是,它們避免頻繁地顯式同步到磁盤。

  3. 將所做的更改寫入內存數據庫,並在需要時手動進行同步。 優點:高速可靠。 缺點:比較復雜,另一個程序可以在不知道的情況下寫入數據庫。 通過寫入內存數據庫,您不需要同步到磁盤。 其他程序可以寫入數據庫文件,如果不小心可以覆蓋這些更改。 此選項可能太復雜而不值得使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM