2012-07-22 26 views
0

我正在寫一個服務,需要一個嵌入式數據庫來存儲基本信息(id,插入日期,上次更新以及我將返回的大量實際數據)。我將有多個線程同時讀取不同的行,並且至少有一個線程同時更新行。我寧願選擇多個線程進行更新,但我可以只用一個線程進行更新。基本上這是一個緩存服務,但通常我的數據的99%將在緩存中,並且我可以讓單個線程填充缺少的內容,因爲它是緩存每分鐘限制請求數的服務的緩存,因此緩存所有數據。C#嵌入式並行和單聲道支持Db

我希望能夠在windows或linux上運行,所以dotnet和mono支持是必須的,但幾乎所有我看過的嵌入式數據庫都不支持併發性,這對我來說是必須的。對象數據庫或sql數據庫只要與dotnet集成良好,就不會同時存在。

我希望有人有類似的情況需要一個嵌入式數據庫併發支持的經驗。此外,如果可能的話,我更希望有一個免費的(成本明智的)數據庫,因爲這只是在這個階段的家庭個人項目。我已經看過一些數據庫(STSdb,SQL CE,Firebird,在codeplex上的一堆開源代碼),但它們要麼在mono/linux上不工作,要麼似乎沒有併發支持。

回答

4

您可以使用SQLite it't支持單聲道(http://www.mono-project.com/SQLite),它具有併發支持,報價從FAQ問題5:

問:能否多個應用程序或同一 應用程序訪問多個實例一個數據庫文件在同一時間?

答:多個進程可以同時打開同一個數據庫。 多個進程可以同時做一個SELECT。但是,只有 一個進程可以在 的任何時刻對數據庫進行更改。

+0

我目前正在看SQLite。只有我會指出它的併發性是這樣的。現在在doco裏找不到它,但是我正在閱讀的其中一個頁面說,線程是壞的,雖然它確實支持併發,但它似乎是通過將實例限制在內部的一個線程來實現的。 – Seer 2012-07-23 00:12:54

+0

這就是說,將它內部限制在數據庫中的一個線程中可能不是一個大問題,因爲數據庫應該很快。根據操作系統,你不需要不同的DLL或sqlite的somethign嗎?到目前爲止,這似乎是最好的選擇 – Seer 2012-07-23 00:15:35

+0

是的,你需要不同的二進制文件(* .dll或* .so)來查看單聲道項目SQLite頁面上的先決條件。我不知道這種「單線程」限制(http://www.sqlite.org/cvstrac/wiki?p=MultiThreading,http://sqlite.phxsoftware.com/forums/t/56.aspx) – 2012-07-23 00:27:55

0

我們在談論多少數據?
它需要成爲一個數據庫嗎?

如果只有一個'表'可以寫一個使用文件系統的小圖層,每行一個文件夾命名爲id-createdDate-updatedDate,並且只是在其中引入一個文本文件?你仍然可以獲得共同的讀取和有限的寫入

+0

我將有大約100k行我將使用文件系統來存儲文件,因爲我主要通過ID但我還需要能夠快速查找上週沒有更新的記錄,基於記錄中存儲的日期等,所以我認爲數據庫會更好(只要它具有某種索引,文件DB就可以) – Seer 2012-07-23 00:12:05

0

自從這個問題首次被問到一個變化是你現在可以使用.NET異步並等待功能,以便不能夠做併發寫入不太可能會導致一個瓶頸。

相關問題