2011-08-02 54 views
18

對不起,這個問題,我不知道如果我理解的概念,但SQLite是無服務器,這意味着在本地計算機的數據庫,它存儲在一個文件,這個文件是隻在一個模式下訪問:如果一個客戶端讀取它,它僅適用於其他客戶端的讀取模式,並且如果客戶端寫入,則所有客戶端都具有寫入模式,因此只能同時在一種模式下使用!所以想象一下,我做了一個Django應用程序,例如博客;那麼這是如何使用sqlite?因爲如果一個客戶端進入博客,他會發現閱讀模式以查看頁面和博客條目,如果註冊客戶端試圖添加註釋,那麼該文件將被設爲寫入模式,那麼sqlite如何處理? 那麼,SQLite在這裏就像BaseHTTPServer(django附帶的服務器)一樣,用於測試和學習目的嗎?在生產中使用Django中的SQLite?

回答

29

不同的數據庫以不同的方式管理併發,但在sqlite的,使用的方法是一個全球性的數據庫級鎖。一次只有一個線程或進程可以更改sqlite數據庫;所有其他併發進程將被迫等待,直到當前正在運行的進程完成。

隨着用戶的數量增長;源碼的簡單的鎖定策略,將導致越來越大的鎖爭用,你需要將數據遷移到另一個數據庫,如MySQL(這可如何是好行級鎖,至少與InnoDB引擎)或PostgreSQL(使用多版本併發控制) 。如果你預計你會得到相當數量的用戶(比如說,在一天中的一大部分時間裏,每秒多於一個請求),你應該從sqlite遷移;越快越好,越容易。

+0

,看來PostegreSQL更好?你怎麼看? – Abdelouahab

+7

好吧,如果你是在向我徵求意見,那麼是的,我認爲PostgreSQL更好。但是,這不是適合這種討論的地方;也許看看[維基百科](http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems)進行客觀比較。 – SingleNegationElimination

+1

我使用PostgreSQL和MySQL。我更喜歡PostgreSQL的大型項目,主要是因爲事務支持,但MySQL適用於較小的應用程序。 –

6

在數據庫理論這個問題被稱爲併發性和SQLite確實根據FAQ支持它的Windows版本> Win98和其他地方:

http://www.sqlite.org/faq.html#q5

我們知道沒有其他嵌入式SQL數據庫引擎作爲 作爲SQLite支持很多併發。 SQLite允許多個進程一次打開數據庫文件,並允許多個進程一次讀取數據庫 。當任何進程想要寫入時,它必須在整個數據庫文件更新期間鎖定整個數據庫文件。但通常 只需要幾毫秒。其他進程只需等待作者 完成,然後繼續他們的業務。其他嵌入式SQL數據庫引擎通常只允許單個進程一次連接到數據庫。

基本上,不要擔心併發性,任何值得其鹽的數據庫都照顧得很好。關於SQLite3如何管理這個的更多信息可以在here找到。作爲開發人員,您不是數據庫設計人員,除非您對內部工作感興趣,否則不必關心它。

+0

所以這只是幾秒鐘的問題?這就像時間分享的想法? – Abdelouahab

1

SQLite是不是真的意味着生產。即使在Windows上也可以很容易地啓動並運行MySQL或PostgreSQL,並且擁有一個真正的數據庫。

真正的問題是,sqlite3的是不是在Django螺紋,只有一個頁面視圖可以在你的服務器上時有發生,看到這個錯誤https://code.djangoproject.com/ticket/12118

我甚至都不在開發中使用sqlite3的。

+0

所以SQLite只在這裏用於測試目的? – Abdelouahab

+2

Sqlite也適用於教授數據庫概念(因爲它很容易設置)和研究(因爲源代碼很小且簡單)。對於這些東西中的每一個,SQLite都非常出色。對於繁重的交易負載,有更好的選擇。 – SingleNegationElimination

+1

是的,測試/開發。一旦你開始建立一個更復雜的網站,你需要一個真正的數據庫,你可能會需要從Django的教程一些原始的SQL(我已經建立了3個Django的網站和所有三個都需要一對夫婦查詢一些原始的SQL) –

5

SQLite是像BaseHTTPServer或任何基本類似。這是一個全功能的嵌入式數據庫。太快了。它的SQL語言可能沒有最多的花裏胡哨的,但它足夠靈活。我還沒有遇到過我需要的東西,它不能做我參與的項目(這不是典型的網絡應用程序,真相被告知)。

任何人聲稱SQLite是不討論實際的設計是不會告訴你多好還是壞生產。 SQLite非常快。在某些情況下,硬是數量級比說更快,Postgres的,它出來作爲一個去到Djangonauts之間的替代。正如有人指出的那樣,它也支持大量的併發。這是你的應用程序是否屬於「某些情況下」的問題。

現在,有一個必須考慮的一個顯著因素。 SQLite是一個進程內數據庫。這非常重要。如果您使用的是gevent,您可能會遇到應用程序中斷的情況。例如,試圖在中間進行上下文切換的事務可能會以可怕的方式破壞事務。換句話說,'併發'真的取決於你的應用程序,因爲SQLite是你的應用程序的部分

你不能使用SQLite做什麼,不過,在比例方面,是你不能讓SQLite的服務器集羣就像你可以用一些其他的數據庫引擎,因爲它的進程。你的應用程序可能需要也可能不需要在縮放方面達到這樣的長度,但我的猜測是絕大多數的應用程序都不會(狂妄猜測)。

在另一方面,在進程是指加入自定義功能和聚集到它是相當微不足道的。我不確定Django的ORM是否會讓它變得更加困難,但是您可以利用這些功能來設計相當不錯的設計。