1. 程式人生 > >個人對SQLite使用的一些體會

個人對SQLite使用的一些體會

在網上看了一下SQLite的適用場景。100000次/天訪問量的網站,嵌入式裝置和應用軟體,應用程式檔案格式等。但是讀資料可時也會拋鎖表的異常,SQLite的鎖是粗粒度,這個對異常的處理不知如何是好;還有的就是資料庫的損壞。Database disk image is malformed。網上說資料庫造成資料庫損壞的原因有三個 1.sqlite資料庫在寫入時斷電等,導致資料庫裡的結果被破壞。 2.sqlite資料庫所存的磁碟空間不夠。 3.磁碟有壞磁軌等 之前資料庫的損壞估計是第一種原因。而當時又沒有對資料進行什麼備份。只能人工用.dump命令從損壞的資料庫中把資料匯出來。這個順帶也講一下吧 在SQLite的命令模式中開啟資料庫,依次輸入一下命令 sqlite> .mode insert sqlite> .output test.sql sqlite> .dump sqlite> .exit   當然不一定要”.exit”命令,按“Ctrl+C”或直接關掉都行,匯出的檔名“test.sql”隨個人喜好。 或者用這個命令更好 sqlite3.exe dbname.db .dump>fileName.sql 這個命令匯出的SQL會比上面那個要工整。 無論哪一種匯出的SQL,如果資料庫有問題的,匯出的SQL裡面會有這行 /**** ERROR: (11) database disk image is malformed *****/ 最後也只能回滾事務RollBack。 要是想用回這些資料的話,把回滾事務改掉,把那句ERROR的刪掉。 然後就是匯入資料 sqlite3.exe newDBName.db sqlite> .read test.sql sqlite> .exit 今後就打算對SQLite定期進行備份,備份的方式也只是單純的檔案IO操作――Copy一份唄。在讀寫資料庫時萬一丟擲Database disk image is malformed異常時就認為資料庫已經損壞了,馬上換上備份的資料庫。 還有在寫資料庫的時候,在對資料庫裡多條記錄進行操作的時候,對多個表的資料操作的時候用事務包起來,那麼在寫入資料庫的時候,在資料庫檔案相同的目錄下會產生一個檔名格式為: 資料庫檔名 + "-journal"的檔案。該檔案在事物提交或回滾後將被立刻刪除,不過聽說在Android下,這個檔案沒被刪除,只是以一個0B大小的檔案存在。在事物執行期間,如果當前主機因電源故障而宕機,而此時由於回滾日誌檔案已經儲存在磁碟上,那麼當下一次程式啟動時,SQLite在開啟資料庫檔案的過程中將會發現該臨時檔案的存在,SQLite會在成功開啟資料庫之前先基於該檔案完成資料庫的恢復工作,以保證資料庫的資料回覆到上一個事物開始之前的狀態。這樣雖然不能避免資料庫的損壞,但是能保證資料狀態的一致性。 由於資歷和認識尚淺,以上說錯的還請各位指出,若各位有什麼好門路的,也懇請指引一下。謝謝!