2012-12-03 44 views
2

我有一個應用程序,它一直運行並接收一些消息(它們的速率從每秒幾個變化到每小時不變)。每條消息都應該放入SQLite數據庫中。什麼是最好的方法來做到這一點?SQLite的許多小寫入

在每封郵件上打開和關閉數據庫聽起來都不太好:如果每秒有數十個數據庫,它將會非常慢。

另一方面,打開數據庫一次並寫入數據庫可能會導致數據丟失,如果該過程意外終止。

回答

2

這聽起來像你做的任何事情,你必須做出權衡。

如果安全是您最關心的問題,那麼更新每條消息的數據庫並採取速度命中。

如果你想要一個妥協,然後更新數據庫寫每一個這麼多的消息。例如,維護一個緩衝區和每一百條消息,發佈一個更新,幷包裝在一個事務中。

事務包裝很重要,原因有兩個。首先,它最大限度地提高速度。其次,如果您使用日誌記錄,它可以幫助您從錯誤中恢復。

如果您進行上述批量更新,您可以通過記錄每個消息來記錄文件,從而增加額外的安全級別。每次數據庫更新成功發佈時,您都將重置此日誌。這樣,如果更新失敗,則知道它在整個塊上失敗(因爲您正在使用事務),並且您的日誌中將包含未更新的信息。這將允許您重新發布更新,甚至可以查看導致失敗的數據是否有問題。這當然假設保持日誌比更新數據庫便宜,根據您的連接方式,情況可能如此。

0

如果您的最高費率是「幾個每秒」,那麼我沒有看到打開和關閉數據庫的真正問題。如果在服務器故障的情況下立即記錄數據至關重要,那麼情況尤其如此。

我們在報告產品中使用SQLite,我們能夠剔除的最佳性能是以每次數千個塊的方式記錄行。我們的默認設置是50k左右。這意味着我們的應用程序會等待,直到收集到50k行數據,然後將其作爲一個事務提交。

0

有一個簡單的算法來調整你的應用程序的行爲的消息率:

  • 當你剛纔寫的郵件,檢查是否有任何新的消息。
    • 如果是的話,也寫下該消息,然後重複。
  • 只有在用完即時可用消息時,提交事務並關閉數據庫。

以這種方式,每個消息都會立即保存,除非消息速率太高。

注意:關閉數據庫不會增加數據的持久性(這是事務提交的目的),它只會釋放一點點內存。