谈谈Asp.net网站优化一:SqlDataReader和DataSet的选择
本文 发布之后,我发现有N多个 喜欢人云亦云的朋友,别人说 数据库连接比 内存贵,你也说个 数据库连接比内存贵,难道内存便宜就能成为我们不优化代码的借口吗?
几乎在每次面试的时候都会被问道这个问题。使用.NET开发当中读取数据应该采用SqlDataReader 还是DataSet以及对这两者的理解。
先来谈谈我本人对这两者的理解:
1、SqlDataReader:提供一种从SQL Server 数据库读取行的只进流的方式。无法继承此类。白话解释就是 使用这个对象可以从数据库中读取只读类的数据。所谓只读,可以理解为一头走到死,不撞南墙不回头。就好比割麦机收麦子一样,这一茬过去了后边就没有了。(千万不要理解为数据库中的数据是只读的)
那么在什么情况下我们才会用到SqlDataReader这个对象呢?
首先、从数据库中读取一个实体对象的时候我们可以用到SqlDataReader
其次、读取一系列(列表)数据的时候可以用到SqlDataReader.
需要注意的是。在使用SqlDataReader读取完数据之后要对其进行显式Close.否则他和数据库就一直连接着,占用内存不说,还容易出现问题。
如果使用完成之后显示将其销毁,这个时候他已经不在占用内存等等耗费资源的东西了!
2、DataSet:MSDN(DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。)
白话解释:DataSet 是一个数据集合,是存放在内存中的。相当于一个存放在内存中的数据库(数据集合)并且不依赖于数据库。
相比SqlDataReader,DataSet的好处就是在于数据库断开连接之后。DataSet仍然保存在内存中,可以随意对其进行操作,比如,删除row,合并,追加,修改某个数据等等。
需要注意的是,由于DataSet是读取后可以立刻关闭和数据库的连接,这个时候DataSet就会存在内存中的。所以在等待GC自动回收之前,他一直占用系统资源。对于我们读取列表来说,把这样一堆数据存在服务器内存中显然不是明智的选择。
服务器内存是有限的。程序中如果存在大量没有被GC回收的DataSet ,后果……….
开发中对于SqlDataReader和DataSet的选择以及取舍
如前文所述,几乎每次面试的时候都会被问道这个问题。我相信very very much 的童鞋对这两者的区别已经相当的了如指掌,甚至达到炉火纯青的地步。
但是,我看到过大多数的程序。包括我如今新的新公司现有的项目,我几乎找不到SqlDataReader的影子。为什么呢?
在这里我有个疑问,也就是为什么大家会选择DataSet而不是SqlDataReader来读取数据? 很显然,如果答案是DataSet更方便那是非常扯淡的!
我在想,是否所有喜欢DataSet的童鞋们对DataSet和SqlDataReader的理解还不够深入?我想不是的。或许是大家对概念性的东西不入尊耳,又或者是企业为了追寻开发效率,又或者大家以为在程序中对一个用DataSet读取出来的列表进行修改删除就是所谓的“可以随意对其进行操作”。
我需要纠正的一点是:此“随意操作”非彼“随意操作”
- 发表评论
-
- 最新评论 更多>>