.NET開源數據庫的前世和今生(上)
2009-12-07 22:53 靈感之源 閱讀(7146) 評論(29) 收藏 舉報后來者可以充分利用前人的成果,在開發界,我們也會這樣做。我們可以發現很多.NET的開源項目都是從優秀的Java項目移植過來的:我用得比較多像NHibernate、DotLucene(暫停開發...)、iTextSharp、Quartz.NET等。移植總比從頭寫輕松多了,不是嗎?
數據存儲是軟件中不可或缺的組成部分。我們所熟知和使用的,以前有Access,現在有MS SQL Server、Oracle、DB2這些商業數據庫,開源的有PHP用得最多的MySQL,有趣的是PHP內置了SQLite。比較少用的如Firebird、PostgreSQL、Berkeley DB(Berkeley DB for .NET)等。
幾年前我寫了一些開源項目的隨筆,數據庫是其中一種,不過當時還沒有出現成熟的.NET開源數據庫,寫得最多的倒是在嵌入式應用最廣泛c寫的SQLite。我對嵌入式/輕量級的數據庫有情結,對SQLite尤甚。SQLite的應用非常廣泛,如官方所說的諾基亞開源手機操作系統塞班(Symbian)、Mozilla、Safari、Chrome和非常多的桌面應用等。后來出現了ADO.NET Provider for SQLite(for .Net 1.x的,現在停止開發),最后出現了現在.NET程序使用最多的來自phxsoftware的System.Data.SQLite,最出名的應用者估計就是飛信了。除了稍微顯得有點重口味的System.Data.SQLite,我們還有非常輕口味的sqlite-net。sqlite-net還是封裝了SQLite.dll,不過它只了16K的代碼,而且是OO方式存取數據,可以認為是一個簡單的ORM。不過,這些都不是開源的.NET數據庫,充其量其實包裝(wrapper),而且是最原始的那種InterOp的做法,連Managed C++都不是。.NET都發展了9年多了,是時候有一個像樣的數據庫了。即便不是原創的,從Java移植一個成熟的也是不錯的。
差不多那個時候,出現了一個人,Mark Tutt,寫了第一個.NET數據庫(據我所知):SharpHSQL,這是從Java界應用非常廣泛的HSQLDB移植過來的,而HSQLDB又是從HSQL衍生過來的,不過這是另外一個話題了。Mark Tutt移植完了就不繼續維護了,這倒不是大問題,問題是他移植的版本根本保存不了數據到文件(所謂的持久化),在內存中跑完,程序關閉就沒了,根本就沒法用(你只想用純內存版另當別論)。
HSQL,這就是SharpHSQL的前世,但今生呢?Mark Tutt之后,andresv接過了SharpHSQL,并讓它成功地讓數據保存到文件。感謝上帝,終于有一個純.NET的數據庫了。另外說一下,andresv還是另外一個不大出名的ORM-Retina.NET OR/M的作者。
可以預想到的是,andresv繼承了Mark Tutt的“光榮傳統”,在項目移植完了就不再維護了,以至于HSQLDB發展得紅紅火火的,SharpHSQL還像個玩具那樣弱不禁風。
在HSQL的薪火貌似終止的時候,出現了一個龐然大物讓我眼前一亮:Minosse Relational DataBase System,一個大型的純C#開源數據庫系統。嗯,不是單純的引擎,是系統。可惜,開源界最臭名昭著的噩夢又發生在Minosse身上,在經過短暫的狂喜之后,便失去了繼續開發的動力。
開源界的.NET數據庫再次陷入了靜寂。
直到今年,再次風起云涌,一下子冒出了3個重量級的項目:csharp-sqlite、EffiProz、DeveelDB。
首先說說csharp-sqlite,相信部分同學已經對這個項目有一些了解:這是SQLite最新版本的C#移植版,雖然其作者Noah Hart認為這不能算是移植,而是用C#模擬C。這個移植版是100%二進制兼容SQLite數據庫格式的,所以你可以用它來讀寫SQLite創建的數據庫。該作者曾說,這只是一個為了學習C#的練手項目,而且一練就2年多,估計都練到九重天了吧。總的來看,這個作者相當重口味。
同學們肯定想知道這個這個項目的性能:
Aug 21, 2009 Updated to 3.6.17
小型數據庫
| # 記錄數 | 插入 | 查詢 2X | 循環 2X | 刪除 | |
| SQLite | 100,000 | 2.2s | 3.5s | 0.3s | 2.0s |
| C#-SQLite | 100,000 | 5.7s | 4.1s | 0.3s | 4.3s |
| C#/SQLite | 2.6x | 1.2x | 1.0x | 2.2x |
大型數據庫
| # 記錄數 | 插入 | 查詢 2X | 循環 2X | 刪除 | |
| SQLite | 1,000,000 | 42.8s | 43.3s | 3.0s | 35.5s |
| C#-SQLite | 1,000,000 | 116.0s | 60.0s | 2.9s | 89.2s |
| C#/SQLite | 2.7x | 1.4x | 1.0x | 2.5x |
簡單的來看,檢索/循環的速度跟SQLite差異不大,插入和刪除就只有SQLite的50%不到。
除此之外,最關心的還是怎樣獲取代碼。請訪問這里獲取代碼,csharp-sqlite比較特別,沒有采用常見的CVS、SVN這兩種項目代碼控制服務,而用了比較冷門的HG,不過跟TortoiseCVS、TortoiseSVN一樣,我們還有TortoiseHg,不過同樣地讓人不爽的是:TortoiseHg一樣會強制關閉Explorer.exe來讓資源管理器插件生效,現在的安裝程序都把自己當大爺,頗為毫不客氣。當然,你也可以直接點擊這里下載,內含最新代碼和已編譯DLL。
在使用TortoiseHg獲取代碼之后,就會遇到編譯問題,如果你新建一個項目,把*.cs放進去,然后編譯,問題就會出來了,因為csharp-sqlite一樣學了c那套復雜的編譯條件。
不過,需要注意的是,csharp-sqlite只是Noah Hart的個人行為,跟SQLite的官方沒有任何關系,所以當初為了這個項目的名稱,還跟SQLite之父D. Richard Hipp魚雁傳情好幾回,最后在承諾撇清與SQLite的官方關系之后(就是不想做額外的售后服務),才得了這個名字。可見D. Richard Hipp還相當懶惰的。
csharp-sqlite的實際使用并不是傳統的ADO.NET那樣,因為它沒有提供這個接口,你只能直接調用跟所謂的Native接口。當然,作者還是做了一些封裝,你可以用類似Command接口的SQLiteDatabase,進行ExecuteQuery(返回DataTable)、ExecuteNonQuery。
另外,csharp-sqlite的穩定性還是讓人擔心的,雖然作者宣稱已經通過了SQLite官方的99.99%的測試,但他卻是這樣回答是否可以在正式產品中使用的:“我也想知道,如果你用了,請告訴我情況。”
有趣的是,Tim Anderson弄了個在Silverlight跑的Quick and dirty版本,不過這僅僅是一個概念驗證罷了,因為屏蔽了原來csharp-sqlite中為了實現文件鎖而調用的Win32 API,只能單線程跑。值得一說的是,這廝搶注了這個域名相當不錯。
最后,我對于作者連基本的代碼和編譯好的壓縮包都不提供這種行為表達相當的不爽和最強烈的反對。
ToDo in .NET開源數據庫的前世和今生(下):
1.EffiProz
2.DeveelDB
3.DB40
4.Perst4net
5.其它開源數據庫
6.比較
7.n個為什么
浙公網安備 33010602011771號