2012-03-01 92 views
3

在hign併發環境中SQLite阻塞表丟失數據。我正在尋找提高SQLite的高性能並且不會丟失插入查詢數據的方法。我的意圖是知道用於插入的併發用戶數限制,即網站在「高併發性」的情況下工作(在本例中爲1插入請求)。爲了使這個測試案例更簡單,用戶會發送數據到數據庫Sqlite3插入性能測試

節省尋找如何提高性能和使用建議其他用戶後:

  • sqlite.org
  • sqlite.org/的faq.html#Q19
  • stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite
  • stackoverflow.com/questions/54998/how-scalable-is-sqlite

我決定在一個亞馬遜小實例中做一個小測試。

平臺

  • Linux版本的2.6.35.14-106.53.amzn1.i686([email protected])(gcc版本4.4.5 20110214(紅帽4.4.5-6)( GCC))#1 SMP週五1月6日十六時20分23秒UTC 2012
  • SQLite的3.6.20
  • Lighttpd的1.4.29
  • 腓5.3.10

test.php with insert sql:

PRAGMA synchronous = OFF; BEGIN TRANSACTION; INSERT INTO testdata1date)VALUES('「。$ _ POST ['data1']。」',date()); END TRANSACTION;

使用Apache HTTP服務器基準測試工具。

數據庫是文件系統中不在RAM中的文件。

結論: 測試1:AB -n 10000 -c 50 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 時間採取測試:63.637秒
  • 完成請求:10000
  • 失敗請求:0
  • Sqlite插入行:10050
  • Average:159.52 insert/sg

Test2:ab -n 10000 -c 100 -k xxxx.xxx/test.php?DATA1 = fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 時間採取的測試:64.221秒
  • 完成請求:10000名
  • 失敗的請求:0
  • SQLite的插入的行:10100
  • 平均:157.26插入/ SG

Test3:ab -n 10000 -c 150 -k xxxx.xxx/test.php?data1=fc82bf71a0d 5f8a3c2dc868ebe0d6eaa

  • 時間採取測試:33.338秒
  • 完整的請求:10000名
  • 失敗的請求:7095
  • (連接:0,接收:0,長度:7095,例外:0)
  • SQLITE:2905插入行
  • 平均值:丟失數據!

TEST4:AB -n採取測試10000〜C 200的-k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 時間:33.705秒
  • 完成請求:萬名
  • 失敗的請求:7049
  • (連接:0,接收:0,長度:7049,例外:0)
  • SQLITE:2918插入行
  • 平均:丟失數據!

在這個特定的環境中,我們可以使用SQLite最多100個併發用戶,平均值爲157.26 insert/sg。考慮到這個結果只適用於插入數據。

從我的無知,有可能防止丟失數據?是否有可能改善這種表現?

+0

我喜歡SQLite的,但你真的不打自己的優勢......爲什麼不記錄到文件中,然後定期導入that've對於SQLite – Eli 2012-04-15 05:42:10

+0

我們正在使用sqlite3的生產與基於Web的約20個用戶Rails應用程序(並非全部都在同一時間在線)。到目前爲止,我們還沒有聽到投訴。現在我們正在開發一個擁有大約60個用戶的Web應用程序,我們想知道是否需要使用其他數據庫,如postgres或mysql。您發佈幫助以瞭解sqlite3的限制和100個併發用戶對我們的應用程序看起來不錯。你是否嘗試從多臺電腦或更大的數據集插入啓動插入? Sqlite3使用非常簡單,我們喜歡它。 – user938363 2012-10-16 15:35:44

+0

c = 100和150之間是否有c測試沒有丟失數據? – user938363 2012-10-16 17:48:23

回答

2

我認爲Sqlite3不應該在你的情況下使用。是的,sqlite3是處理併發性很好的嵌入式數據庫之一,但爲了擴展並提高性能,我建議僅使用服務器/客戶端數據庫。

讓我們看看你最近的測試,你在大約30秒內發出10000個請求。如果他們平均分配,Sqlite3將不允許每個事務需要超過3ms(請記住,sqlite3一次只允許一個寫入過程)。我們來看看sqlite文檔。 (http://www.sqlite.org/faq.html

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

總結:只是鎖定數據庫需要幾毫秒,而不是說更新本身。

然而,客戶機/服務器數據庫引擎(如PostgreSQL的,MySQL和或 甲骨文)通常支持併發的更高水平,並允許 多個進程在同一 時間被寫入到相同的數據庫。這在客戶端/服務器數據庫中是可能的,因爲總是有一個良好控制的服務器進程可用來協調 訪問。如果您的應用程序需要很多併發性,那麼您應該考慮使用客戶機/服務器數據庫。但是經驗 表明,大多數應用程序所需要的併發性比設計者想象的要少得多。

您有幾種可能性:

  • 變化的方式您的應用程序工作。你不太可能需要那麼多的併發。
  • 如果您仍然堅持需要併發性和良好穩定的性能,請切換到客戶端/服務器數據庫。
  • 接受某些請求在您的負載達到峯值時失敗。