個人感覺在Java領域大型開發都離不了ORM的身影,所謂的SSH就是Spring+Struts+Hibernate,除了在學習基礎知識的時候被告知可以使用JDBC操作數據庫之外,大量的書籍中都是講述使用Hibernate這個ORM工具來操作數據。在.NET中操作數據庫的方式有多種,除了最直接的方式就是使用ADO.NET之外,還可以使用NHibernate這個Hibernate在.NET中的實現ORM,如果你對第三方的ORM持懷疑態度,你還可以使用來自微軟的實現、根正苗紅的Linq或者EntityFramework。
大部分從早期就開始使用.NET開發的程序員可能對ADO.NET有種迷戀,使用ADO.NET可以充分將我們早期的SQL知識發揮得淋漓盡致,並且出於對性能的考慮,有些人對.NET中的ORM還保持一種觀望態度,包括我自己也是這種態度。不過即使在實際開發中不用,並不代表我們不能去了解和比較這些技術,任何事物的出現和消亡總有其原因的,我們可以了解它們的優點和長處。所以本人抽出了幾個周末的時間分別用NBear、NHibernate、GentleNet,IBatis.Net和SubSonic來實現對數據庫單表數據的創建、讀取、更新和刪除操作,也就是所謂的CRUD(C:Create/R:Read/U:Update/D:Delete)。
目錄:
1)、效率測試環境介紹。
2)、測試框架簡介。
3)、測試CRUD結果表格對比。
4)、測試CRUD排行。
5)、框架優缺點分析。
正文:
1)、效率測試環境介紹。
采用netframework 4.0 Web網站項目,使用Stopwatch進行執行時間統計,使用Parallel對象實現並發操作。為了測試的接近實際型,我執行的時候關掉了電腦上的所有程序,除測試程序,10次相同環境下重復測試10萬條數據量的平均值。
測試數據庫T-Sql:

create database OrmDB
go
use OrmDB
go
create table OrmTable
(
id int identity primary key,
infoName varchar(250) not null,
infoDesc text not null,
createTime datetime default Convert(varchar(50),getdate(),120)
)
go
create database OrmDB
go
use OrmDB
go
create table OrmTable
(
id int identity primary key,
infoName varchar(250) not null,
infoDesc text not null,
createTime datetime default Convert(varchar(50),getdate(),120)
)
go
2)、測試框架簡介。
Stopwatch watch = new Stopwatch();
watch.Start();
Parallel.For(0, 100000, i =>
{
// ...業務
});
watch.Stop();
Response.Write(watch.ElapsedMilliseconds);
3)、測試CRUD結果表格對比。
添加功能測試表:
操作 |
添加 |
||||
數據量(萬條) |
10w |
||||
測試次數 |
10次 |
||||
框架名稱 |
GentleNet |
NBear |
iBatis.Net |
SubSonic |
NHibernate |
並發執行時間(ms) |
36,731 |
113,793 |
36,321 |
56,342 |
未測 |
非並發執行時間(ms) |
115,875 |
223,768 |
100,719 |
124,844 |
1,247,572 |
修改功能測試表:
操作 |
修改 |
||||
數據量(萬條) |
10w |
||||
測試次數 |
10次 |
||||
框架名稱 |
GentleNet |
NBear |
iBatis.Net |
SubSonic |
NHibernate |
並發執行時間(ms) |
25,985 |
140,779 |
33,366 |
36,916 |
未測 |
非並發執行時間(ms) |
98,868 |
279,851 |
102,875 |
102,821 |
1,226,506 |
查詢功能測試表:
操作 |
查詢 |
||||
數據量(萬條) |
10w |
||||
測試次數 |
10次 |
||||
框架名稱 |
GentleNet |
NBear |
iBatis.Net |
SubSonic |
NHibernate |
並發執行時間(ms) |
19,776 |
94,265 |
39,854 |
26,784 |
未測 |
非並發執行時間(ms) |
54,515 |
157,676 |
37,339 |
67,344 |
1,438,398 |
刪除功能測試表:
操作 |
刪除 |
||||
數據量(萬條) |
10w |
||||
測試次數 |
10次 |
||||
框架名稱 |
GentleNet |
NBear |
iBatis.Net |
SubSonic |
NHibernate |
並發執行時間(ms) |
33,802 |
101,516 |
31,964 |
28,223 |
未測 |
非並發執行時間(ms) |
102,107 |
211,105 |
88,420 |
97,846 |
1,230,465 |
4)、CRUD測試排行。
以下為10萬條數據的查詢排行,單位為毫秒(ms)。
========================================================
增加排行:
Top1:iBatis.net 並發:36,321ms 非並發:100,719ms
Top2:GentleNet 並發:36,731ms 非並發:115,875ms
Top3:SubSonic 並發:56,342ms 非並發:124,844ms
Top4:NBear 並發:113,793ms 非並發:223,768ms
Top5:NHibernate 非並發:1,247,572ms
========================================================
修改排行:
Top1:GentleNet 並發:25,985ms 非並發:98,868ms
Top2:iBatis.net 並發:33,366ms 非並發:102,875ms
Top3:SubSonic 並發:36,916ms 非並發:124,844ms
Top4:NBear 並發:113,793ms 非並發:102,821ms
Top5:NHibernate 非並發:279,851ms
========================================================
查詢排行:
Top1:GentleNet 並發:19,776ms 非並發:54,515ms
Top2:SubSonic 並發:26,784ms 非並發:67,344ms
Top3:iBatis.net 並發:39,854ms 非並發:37,339(非並發下查詢效率最高)ms
Top4:NBear 並發:94,265ms 非並發:157,676ms
Top5:NHibernate 非並發:1,438,398ms
========================================================
刪除排行:
Top1:SubSonic 並發:28,223ms 非並發:97,846ms
Top2:iBatis.net 並發:31,964ms 非並發:88,420ms
Top3:GentleNet 並發:33,802ms 非並發:102,107ms
Top4:NBear 並發:101,516ms 非並發:211,105ms
Top5:NHibernate 非並發:1,230,465ms
========================================================
5)、框架優缺點分析。
Gentle.NET
優點:支持t-sql,語法簡單方便,效率高。
缺點:依賴代碼生成器生成每個實體類。
iBatis.net
優點: 效率比較高,尤其是非並發下效果很高,比較穩定。
缺點:配置文件比較多,t-sql在每個配置文件里面寫,條件查詢比較麻煩。
SubSonic
優點:刪除和查詢效果很好,添加比較慢。
缺點:語法比較接近Linq,語法自成一派比較不滿意。
NHibernate
優點:覆蓋功能比較全,穩定性好,集成性能好,使用比較廣泛,支持t-sql和hql語法。
缺點:配置比較多,比較麻煩,效率比較慢。
NBear
優點:配置最簡單。
缺點:操作語法不成熟,不支持t-sql,使用起來不方便,已經很久沒有更新了。
ps:大家根據測試的結果自行選擇合適的框架。