谈谈Asp.net网站优化一:SqlDataReader和DataSet的选择

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 06:23 点击:

 

本文 发布之后,我发现有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读取出来的列表进行修改删除就是所谓的“可以随意对其进行操作”。

 

      我需要纠正的一点是:此“随意操作”非彼“随意操作”

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1