如题。
如果只考虑性能方面,哪种方式比较好,比较适合高并发高访问量网站?
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 }
1 public List<UserInfo> GetUsers() 2 { 3 using (var conn = Program.OpenConnection()) 4 { 5 return conn.Query<UserInfo>("SELECT * FROM Users").ToList(); 6 } 7 }
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映射成实体数据。
开发程序员需要关心的是哪个工具能提高更多的开发效率.
而不是工具对性能的影响.
开发程序员需要关心的数据库性能是在写数据库访问的时候,想一下会不会有性能问题.
数据库访问工具对性能的影响基本可以忽略不计.在你会写正确sql的时候
个人见解:程序员应该是 性能>开发效率。
如果只在乎开发效率,而不关心性能,那做出来的东西,肯定差强人意。
自己也没学到东西,没有得到好的经验。
@YP小家: 不知道你有没听说过.90%的性能问题是由10%的代码造成的.
在没有性能问题的前提下,开发效率才是最重要的,同一个应用CPU占用率1%和2%没有区别,但为了这1%可能就要增加几倍的工作时间.你觉得这样指的吗?
第一个回答的最后一句才是重点.
那种都没有所谓吧,没有研究过企业库,简单实用过ORM
重要的是你会对数据库进行优化
性能的话,你可以直接上ADO.NET。另外Dapper这种半自动的ORM也是可以选择的,单表操作用ORM这块,复杂查询自己写SQL语句。
嗯。谢谢。
有打算现在就是准备ADO.NET和Dapper共用。
获取DataTable使用ADO.NET,需要转换实体的,使用Dapper直接映射。
@YP小家: 并不需要如此,直接用Dapper就够用了。Dapper的部分方法就是对ado.net的简单包装,只是在之后加了一层实体映射。所以不需要两者混用。性能与可维护性之间平衡就好。
性能问题大部分都是Stupid Coder造成的,不是数据访问组件造成的。
你这么关心性能问题,建议你还是不要使用NET了,汇编语言最适合你了。
最鄙视你这种装X的人了。
生活不如意就干脆死了算了?
使用.Net就不用考虑性能问题了?
还专家六级,博客园的专家六级都是这样子的?
@YP小家: 你可以多想一些,@爱编程的大叔只是想告诉你,这几个的性能差异并没有那么大,完全不用太过纠结。
ADO.NET直接操作SQL ,应该效率上最高。
谢谢。
就是觉得ADO.NET应该是最快的,直来直往。
就是不知道,如果用ADO.NET读取出DataTable,再转换成实体,不知道有没有Dapper的Emit映射快。
@YP小家:
ADO.NET>Dapper
这个问题只能找平衡或者折中的方法,没有答案。“没有万能的银弹”这句话应该有听说过吧。另外,你没有具体说你项目的规模和要求,这样人家没有办法给你判断。现在很多项目更关心的是开发效率问题而不是性能问题了。你项目考虑效率是没有错,但是一个大型的项目,开发的周期和后期的维护会成倍的增加的。
谢谢。
但我问题开头就说明“如果只考虑性能方面”,什么开发效率、什么场景什么项目大小都一概不管。
我只是想知道这三种方式的性能比较。
如楼上贴出来的图,才是最最需要的回答,而不是答非所问,站在“高人”的角度去教育别人。
在net中所有的orm的都是基于ado.net做的 ~从数据访问效率上来说ado.net最快。
我也认同一楼的说法,做项目开发,数据库访问效率只是占一小部分而已,更多的是需要关注开发效率。当然哪些对数据访问性能要求极致的项目除外(比如股票交易等)。项目大一点的除开数据库访问,还有缓存 web服务等。
个人建议:对数据库访问性能要求不高的项目不要去在意使用哪种访问方式,应该多注重开发效率和项目架构。