解決嵌入式使用SQL出現 Error(5): database is locked
阿新 • • 發佈:2018-12-13
之前有遇到通過sqlite3_exec()函式操作資料庫出現 database is locked 這樣的一個問題,特別的記錄一下這個問題。 SQLite,是一款輕型的資料庫,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。 但是,SQL只是支援單執行緒操作的,如果在應用程式中,有多個執行緒同時操作資料庫,也將會產生database is locked的情況。 當出現database is locked,就是有其他的程式(執行緒)佔用著資料庫,可按照以下步驟檢查一下:
- 確定有沒有其他的程序佔用著資料庫;
- 確定當前程序有沒有多執行緒操作資料庫;
- 如果確定之後,發現既沒有其他程序操作資料庫,當前程序也沒有其他執行緒操作資料庫,那麼考慮以下問題。
SQL為了防止多個應用同時使用資料庫,在資料庫內部使用了檔案鎖fcntl()。既然沒有其他的應用使用資料庫,但是又報 database is locked,那麼只有這個鎖出現問題了。 在linux核心中,檔案鎖是需要編譯支援的,檢查linux核心編譯選項,是否已經支援了檔案鎖,操作如下, 在linux核心目錄執行 make menuconfig ARCH=arm 進行核心配置選擇,檢查項如下:
File systems ---> [*] Enable POSIX file locking API
如上路徑,檢查 Enable POSIX file locking API
是否已經選上了,這個將會影響linux核心對檔案鎖的操作,選上之後儲存退出,重新編譯燒寫測試,我遇到的 database is locked 就是這樣解決了。
以上是個人理解,有理解錯誤的地方,歡迎指出,感謝