SQLite 中文指南之FAQ第3/6頁
更新時間:2008年09月12日 18:09:17 作者:
sqllite使用過程中碰到的一些問題解決,中文版
但是,client/server型的數(shù)據(jù)庫引擎 (如 PostgreSQL, MySQL, 以及 Oracle) 通常支持更高的并發(fā)度, 并支持多進程同時寫入同一個數(shù)據(jù)庫。由于總有一個控制良好的服務(wù)器協(xié)調(diào)數(shù)據(jù)庫的訪問,這才保證了以上 特性的實現(xiàn)。如果你的應(yīng)用需要很高的并發(fā)度,你應(yīng)該考慮使用client/server數(shù)據(jù)庫。事實上,經(jīng)驗告訴 我們大多數(shù)應(yīng)用所需要的并發(fā)度比他們的設(shè)計者們想象的要少得多。
當(dāng) SQLite 嘗試操作一個被另一個進程鎖定的文件時,缺省的行為是返回 SQLITE_BUSY。你可以用 C代碼更改這一行為。 使用 sqlite3_busy_handler() 或sqlite3_busy_timeout() API函數(shù)。
如果兩個或更多進程同時打開同一個數(shù)據(jù)庫,其中一個進程創(chuàng)建了新的表或索引,則其它進程可能不能立即看見新的表。其它進程可能需要關(guān)閉并重新連結(jié)數(shù)據(jù)庫。
(8) SQLite是線程安全的嗎?
有時候是的。為了線程安全,SQLite 必須在編譯時把 THREADSAFE 預(yù)處理宏設(shè)為1。在缺省的發(fā)行的已編譯版本中 Windows 版的是線程安全的,而 Linux 版的不是。如果要求線程安全,Linux 版的要重新編譯。
“線程安全”是指二個或三個線程可以同時調(diào)用獨立的不同的sqlite3_open() 返回的"sqlite3"結(jié)構(gòu)。而不是在多線程中同時使用同一個 sqlite3 結(jié)構(gòu)指針。
一個sqlite3結(jié)構(gòu)只能在調(diào)用 sqlite3_open創(chuàng)建它的那個進程中使用。你不能在一個線程中打開一個數(shù)據(jù)庫然后把指針傳遞給另一個線程使用。這是因為大多數(shù)多線程系統(tǒng)的限制(或 Bugs?)例如RedHat9上。在這些有問題的系統(tǒng)上,一個 線程創(chuàng)建的fcntl()鎖不能由另一個線程刪除或修改。由于SQLite依賴fcntl()鎖來進行并發(fā)控制,當(dāng)在線程間傳遞數(shù)據(jù)庫連接時會出現(xiàn)嚴(yán)重的問題。
也許在Linux下有辦法解決fcntl()鎖的問題,但那十分復(fù)雜并且對于正確性的測試將是極度困難的。因此,SQLite目前不允許在線程間共享句柄。
在UNIX下,你不能通過一個 fork() 系統(tǒng)調(diào)用把一個打開的 SQLite 數(shù)據(jù)庫放入子過程中,否則會出錯。
(9) 如何列出一個 SQLite 數(shù)據(jù)庫中的所有的表/索引?
在sqlite3 命令行程序中你可以用命令 ".tables" 來顯示所有的表或者用 ".schema"來顯示所有的表結(jié)構(gòu)和索引。但命令后不要跟 LIKE 語句,否則會限制表的顯示。
相關(guān)文章
SQLite中的B-Tree實現(xiàn)細節(jié)分析
本文將詳細介紹SQLite中的B-Tree實現(xiàn)細節(jié),需要了解更多的朋友可以參考下2012-11-11