个人感觉在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:大家根据测试的结果自行选择合适的框架。