首页 新闻 会员 周边 捐助

求问~数据库操作方式:ADO.NET、微软企业库、ORM(如Dapper)?

0
悬赏园豆:20 [待解决问题]

如题。
如果只考虑性能方面,哪种方式比较好,比较适合高并发高访问量网站?

 

 1  public DataTable GetUsers()
 2      {
 3         using (SqlConnection con = new SqlConnection(sqlConStr)) 
 4         {
 5             using(SqlCommand cmd = con.CreateComand()) 
 6             {  
 7                 Cmd.CommandText = "SELECT * FROM Users";  
 8                 using(SqlDataReader reader = cmd.ExecuteReader())  
 9                 {  
10                     DataTable dt=new DataTable();
11                     dt.Load(dr);
12                     return dt;
13                 } 
14             }
15         }
16     }
ADO.NET

 

1  public List<UserInfo> GetUsers()
2         {
3             using (var conn = Program.OpenConnection())
4             {
5                 return conn.Query<UserInfo>("SELECT * FROM Users").ToList();
6             }
7         }
ORM(如Dapper)
 1   private Database database = DatabaseFactory.CreateDatabase();
 2   public DataTable ConverDataReaderToDataTable(IDataReader reader)
 3         {
 4             if (null == reader)
 5             {
 6                 return null;
 7             }
 8             DataTable table = new DataTable();
 9             table.Locale = CultureInfo.InvariantCulture;
10             int fieldCount = reader.FieldCount;
11             for (int i = 0; i < fieldCount; i++)
12             {
13                 table.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
14             }
15             table.BeginLoadData();
16             object[] values = new object[fieldCount];
17             while (reader.Read())
18             {
19                 reader.GetValues(values);
20                 table.LoadDataRow(values, true);
21             }
22             table.EndLoadData();
23             return table;
24         }
25         
26   public DataTable GetUsers()
27         {
28             DbCommand sqlStringCommand = this.database.GetSqlStringCommand("SELECT * FROM Users");
29             using (IDataReader reader = this.database.ExecuteReader(sqlStringCommand))
30             {
31                return ConverDataReaderToDataTable(reader);
32             }
33         }
微软企业库
 
 

因为这三种访问都是需要写SQL语句的,所以就想问一下哪种性能上会好一些。

照理说,原生的ADO.NET应该是最好,但后续拓展可能没企业库和Dapper方便,而且数据库连接池等方面也要自己封装好,不然可能会适得其反。

而Dapper和企业库都是使用IDataReader读取数据,不同的是企业库是转换成DataTable,而Dapper则直接使用Emit映射成实体数据。

YP小家的主页 YP小家 | 初学一级 | 园豆:166
提问于:2015-10-21 09:26
< >
分享
所有回答(7)
0

开发程序员需要关心的是哪个工具能提高更多的开发效率.

而不是工具对性能的影响.

开发程序员需要关心的数据库性能是在写数据库访问的时候,想一下会不会有性能问题.

数据库访问工具对性能的影响基本可以忽略不计.在你会写正确sql的时候

吴瑞祥 | 园豆:29449 (高人七级) | 2015-10-21 09:30

个人见解:程序员应该是 性能>开发效率。

如果只在乎开发效率,而不关心性能,那做出来的东西,肯定差强人意。

自己也没学到东西,没有得到好的经验。

支持(0) 反对(0) YP小家 | 园豆:166 (初学一级) | 2015-10-21 11:48

@YP小家: 不知道你有没听说过.90%的性能问题是由10%的代码造成的.

在没有性能问题的前提下,开发效率才是最重要的,同一个应用CPU占用率1%和2%没有区别,但为了这1%可能就要增加几倍的工作时间.你觉得这样指的吗?

第一个回答的最后一句才是重点.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-10-21 11:53
1

那种都没有所谓吧,没有研究过企业库,简单实用过ORM

重要的是你会对数据库进行优化

最佳损友。 | 园豆:63 (初学一级) | 2015-10-21 09:43
-1

性能的话,你可以直接上ADO.NET。另外Dapper这种半自动的ORM也是可以选择的,单表操作用ORM这块,复杂查询自己写SQL语句。

幻天芒 | 园豆:37205 (高人七级) | 2015-10-21 09:45

嗯。谢谢。

有打算现在就是准备ADO.NET和Dapper共用。

获取DataTable使用ADO.NET,需要转换实体的,使用Dapper直接映射。

支持(0) 反对(0) YP小家 | 园豆:166 (初学一级) | 2015-10-21 11:43

@YP小家: 并不需要如此,直接用Dapper就够用了。Dapper的部分方法就是对ado.net的简单包装,只是在之后加了一层实体映射。所以不需要两者混用。性能与可维护性之间平衡就好。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2015-10-21 13:14
1

性能问题大部分都是Stupid Coder造成的,不是数据访问组件造成的。

你这么关心性能问题,建议你还是不要使用NET了,汇编语言最适合你了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-10-21 10:22

最鄙视你这种装X的人了。

生活不如意就干脆死了算了?

使用.Net就不用考虑性能问题了?

还专家六级,博客园的专家六级都是这样子的?

支持(0) 反对(1) YP小家 | 园豆:166 (初学一级) | 2015-10-21 11:31

@YP小家: 你可以多想一些,@爱编程的大叔只是想告诉你,这几个的性能差异并没有那么大,完全不用太过纠结。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2015-10-21 13:17
0

ADO.NET直接操作SQL ,应该效率上最高。

JackWang-CUMT | 园豆:2866 (老鸟四级) | 2015-10-21 10:44

谢谢。

就是觉得ADO.NET应该是最快的,直来直往。

就是不知道,如果用ADO.NET读取出DataTable,再转换成实体,不知道有没有Dapper的Emit映射快。

支持(0) 反对(0) YP小家 | 园豆:166 (初学一级) | 2015-10-21 11:34

@YP小家: 

ADO.NET>Dapper

支持(0) 反对(0) JackWang-CUMT | 园豆:2866 (老鸟四级) | 2015-10-21 11:49
0

这个问题只能找平衡或者折中的方法,没有答案。“没有万能的银弹”这句话应该有听说过吧。另外,你没有具体说你项目的规模和要求,这样人家没有办法给你判断。现在很多项目更关心的是开发效率问题而不是性能问题了。你项目考虑效率是没有错,但是一个大型的项目,开发的周期和后期的维护会成倍的增加的。

young.lynn | 园豆:202 (菜鸟二级) | 2015-10-22 19:33

谢谢。

但我问题开头就说明“如果只考虑性能方面”,什么开发效率、什么场景什么项目大小都一概不管。
我只是想知道这三种方式的性能比较。
如楼上贴出来的图,才是最最需要的回答,而不是答非所问,站在“高人”的角度去教育别人。

支持(0) 反对(0) YP小家 | 园豆:166 (初学一级) | 2015-10-23 09:33
0

在net中所有的orm的都是基于ado.net做的 ~从数据访问效率上来说ado.net最快。

我也认同一楼的说法,做项目开发,数据库访问效率只是占一小部分而已,更多的是需要关注开发效率。当然哪些对数据访问性能要求极致的项目除外(比如股票交易等)。项目大一点的除开数据库访问,还有缓存 web服务等。

个人建议:对数据库访问性能要求不高的项目不要去在意使用哪种访问方式,应该多注重开发效率和项目架构。

lenfon | 园豆:255 (菜鸟二级) | 2015-10-25 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册