2009-11-09 57 views
2

美好的一天,我從通信通道接收數據並顯示它。並行,我將它序列化成一個SQLite數據庫(使用普通的SQL INSERT語句)。在我的應用程序退出後,我在sqlite對象上執行了一個.commit。如何可靠地序列化數據

如果我的應用程序在中間被殘忍地終止會發生什麼?即使沒有.commit,最新的(合理的 - 不是說100微秒前,但至少在一秒前)數據在數據庫中安全嗎?或者我應該定期提交?做這些事情的最佳模式是什麼?


我試過(源碼的選項)自動提交,並通過一個因素這減慢代碼很多〜55(自動提交對只有一個提交的結束)。每完成100次插入就會使性能在最佳模式的20%以內。所以自動提交對我來說非常慢。

我的應用程序將大量數據泵入數據庫 - 我能做些什麼來使其運行良好?

回答

1

您應該在每次完成邏輯更改時執行COMMIT。

交易的一個原因是爲了防止未提交的交易數據從外部可見。這很重要,因爲有時單個邏輯更改可以轉換爲多個INSERT或UPDATE語句。如果交易後面的其中一個查詢失敗,交易可以通過ROLLBACK取消,並且根本不記錄任何更改。

一般而言,在COMMIT成功之前,數據庫中不會記錄事務中執行的更改。

沒有這大大減慢我的代碼? - zaharpopov

頻繁提交,可能放慢你的代碼,並作爲優化你可以嘗試分組在一個事務中的幾個邏輯變化。但是這與交易的正確使用背道而馳,你應該在測量之後這樣做才能顯着提高性能。

+0

這不會顯着減慢我的代碼? – zaharpopov 2009-11-09 12:47:09

3

您應該在transaction範圍內執行此操作,並因此在過程中的適當位置執行commit。交易將保證此操作是atomic - 即它可以工作或不工作。

原子性規定,數據庫 修改必須遵循「全或無 」規則。每筆交易是 據說是「原子」,如果當交易的一部分 失敗時,整個交易都會失敗 。儘管存在任何DBMS, 操作系統或硬件故障,數據庫管理系統 仍然保持交易的原子性質是至關重要的。

如果您還沒有提交,那麼當您的進程終止時,插入將不可見(並回滾)。

你什麼時候執行這些提交?當你的插入代表某些一致和完整。例如,如果您必須爲每封郵件插入2條信息,請在插入兩條信息後進行提交。不要在每一個之後提交,因爲你的信息不會一致或完整。

2

數據在數據庫中不是永久的,沒有提交。使用一個偶爾的提交來平衡在一個事務中執行多次插入的速度(提交越頻繁,越慢)與提交更頻繁的提交的安全性。

+0

什麼是最好的辦法呢?計數插入和一次在N做提交? – zaharpopov 2009-11-09 12:42:38

+0

它主要取決於您的應用程序。您可以每N次插入一次,或者每單位時間一次,或者您擁有其他任何刻度源。你必須權衡你的應用程序。 – 2009-11-09 13:00:54