資料轉自:
http://blog.csdn.net/yifanernei/article/details/5642127
SQLite 支援三種線程模式:
1. 單線程模式 SQLITE_CONFIG_SINGLETHREAD
這種模式下,沒有進行互斥,多線程使用不安全
2. 多線程模式 SQLITE_CONFIG_MULTITHREAD
這種模式下,在多線程中使用單個資料庫連接是不安全的,否則就是安全的。(譯註:即不能在多個線程中共用資料庫串連)
3. 串列模式 SQLITE_CONFIG_SERIALIZED
這種模式下,sqlite是安全執行緒的。(譯註:即使在多個線程中不加互斥的使用同一個資料庫連接)
運行時選擇線程模式
如果沒有在編譯時間和啟動時指定為單線程模式,那麼每個資料庫連接在建立時可單獨的被指定為多線程模式或者串列模式,但是不能指定為單線程模式。如果在編譯時間或啟動時指定為單線程模式,就無法在建立串連時指定多線程或者串列模式。
建立串連時用sqlite3_open_v2()函數的第三個參數來指定線程模式。SQLITE_OPEN_NOMUTEX標識建立多線程模式的連
接;SQLITE_OPEN_FULLMUTEX標識建立串列模式的串連。如果沒有指定標識,或者使用sqlite3_open()或
sqlite3_open16()函數來建立資料庫連接,那麼在編譯時間或啟動時指定的線程模式將作為預設的線程模式使用。
再iphone中, 啟動時候 書寫代碼:
sqlite3_config(SQLITE_CONFIG_SERIALIZED); //這句話沒有起到該有的效果 //.....
應可以保證資料一致性問題.
// sqlite3_config(SQLITE_CONFIG_SERIALIZED);
// sqlite3_exec(database,"PRAGMA cache_size = 8000;",NULL,NULL,NULL);
//sqlite3_exec(database,"pragma synchronous = OFF",NULL,NULL,NULL);
sqlite3_busy_timeout(database, 500); //這句代碼生效,和使用線程鎖一個效果...
現在的方案,線程鎖和代碼一起使用.
目前資料庫操作部分沒有用單例.即每次讀取都會去串連資料庫.使用單例的效果應該是一樣的..
持續學習ing