我周圍SQLite的Objective-C的包裝,我沒有寫加工技術,和文檔是稀疏......SQLite的關於iPhone - 用於跟蹤多線程相關的錯誤
這不是FMDB。寫這個包裝的人在寫這段代碼的時候並不知道FMDB。
看來,代碼是從哪兒數據庫連接正在從多個線程訪問的錯誤痛苦 - 這根據SQLite的文檔將無法正常工作,如果如果SQLite是編譯SQLITE_THREADSAFE 2.
我已經測試了作爲iPhone SDK一部分提供的libsqlite3.dylib,並且看到它使用sqlite_threadsafe()例程以這種方式編譯。
使用提供的sqlite庫,代碼在執行例程時定期訪問SQLITE_BUSY和SQLITE_LOCKED返回碼。
爲了解決這個問題,我添加了一些代碼來等待幾毫秒,然後再試一次,最大重試計數爲50.代碼在此之前不包含任何重試邏輯。
現在,當sqlite調用返回SQLITE_BUSY或SQLITE_LOCKED時,將調用重試循環,並重試返回SQLITE_MISUSE。不好。
抓住了吸管,我用自己編譯的SQLITE_THREADSAFE版本替換了所提供的sqlite庫 - 根據文檔說明,這意味着sqlite可以安全地用於多線程環境,從而有效地序列化所有操作。它招致了性能問題,我沒有測量,但它消除了SQLITE_MISUSE的應用程序,並且似乎不需要重試邏輯,因爲它從未達到繁忙或鎖定狀態。
我寧願做的是修復從多個線程訪問單個數據庫連接的問題,但我不能爲我的生活找到它發生的地方。
所以,如果任何人有任何提示尋找多線程的錯誤,我會非常感激。
在此先感謝。