夜里三点多,刚完成微博粉丝精灵V3.763的微博升级,上来看看,刚看到一篇文章:【原】关于使用DataReader的一个很奇怪的问题,不应该用DataReader?

于是准备花点时间解答下,顺便为这个月增添一篇文章。

关于DataReader,以前写过一篇文章,可参考:DataReader 链接关闭解惑篇

下面将对原文,解答两个问题:

一: DataReader、DataTable、DataSet 的简单关系:

这里先取原文的第一句话:.net读取数据集有两种方式:DataSet 和 DataReader

解答:.net 的Command操作里,默认可以有三种返回:DataReader、DataTable、DataSet

这三者的简单关系为:

DataReader 快速只向前读的流,需要开发者自己去关闭流。

DataTable 一个容器,把DataReeader读到DataTable容器后关闭流。

DataSet 一个大容器,里面可放置多个DataTable。

因此开发者,首先要明白这三者的简单关系,才不至于乱猜。

二:数据库链接、链接池、close与dispose

这里再取原文的第N句话:在sqlserver(2000)中查看进程,有非常多的sleeping进程,直到最后打开页面,提示超时,说连接池满。

解答:默认mssql的链接数是有限的,大体在100多个,简单的说你可以open 100多次而不关闭,超过后再open就会出现链接池不够的现象。

这之间的简单关系为:

第一次Open出链接时,连接数据库(由于是首次建立链接,需要初始化先多信息,就是传说的性能问题)

然后你Close时,数据库断开链接,同时把链接状态改成sleep,但是不销毁(为了下次建立链接时省掉初始化,避免传说中的性能问题),这个不销毁的链接,放到一个池里面,被称之为链接池。

如果你Dispose(),则会把链接从池里销毁,当然下次链接就会开始新的初始化。

下面就会有很多种情况出现:

情况一:一个线程的正常操作:

如果使用时一个流程下来,是按顺序的open->close-open->close 状态,那么始终只用到一个链接(从连接池里进进出出),基本没有过多的初始化问题,传说性能好。

情况二:多个线程的不正常操作:

如果你一个链接,在Open状态,这时候另一个线程也要打开链接,发现链接池没有时,就会重新到数据库建一个链接(又开始初始化,一堆信息,最后产生一个链接)。

如果你所有的链接全在Open,不关闭,或者时间拖的很多,在其它线程要链接的时候,你的链接还没关闭,在产生100多个链接后,数据库最大数满了,就会出现“链接池已满”的情况。

情况三:多个线程的正常操作:

如果你懂的每个链接打开后,都快速关闭,通常一个正常语句的操作时间在0.001-0.1秒左右,这样关闭的链接就回到池里,可以快速供给其它线程使用。

这样,仅需要几十个链接,就可以循环的使用处理多线程问题。

简单的假设:

如果一个操作open到close,用时0.1秒一次, 那么一个链接在1秒内可以处理10次操作。而100个链接最大数就可以支持1000次操作。

简单的说就是1秒可以并发操作1000次以上,这对中小网站来说,处理是相当容易的事。

而新手容易犯的错误,就是链接打开后,长时间的不关闭,最后导致在多线程的情况下,把数据库链接资源用尽了,出现了错误而不得知。

进一步的假设

在很多的程序处理中,对数据库的操作时间,往往是不平均的,这就需要有点经验的程序开发者,花点时间,来搞好这最大并发问题,通常是:

对长时间查询的,使用缓存(避免二次查询),或者集中使用队列(因为使用队列,就一个链接就可以搞定了,反正是开了读和关,然后下一个又是开了读和关,始终是一个链接),当然使用队列也要看情况。

对于时间短的,直接处理就可以了。

其实说白了,越往上,就越是“看情况处理”,没有啥定律,要是有,那就是数据库的最大链接数,无论你怎么耍流氓,反正你不能让它一次性给用完。 

补充点:

在sqlserver(2000)中查看进程,有非常多的sleeping进程,直到最后打开页面,提示超时,说连接池满,为什么,既然已经了很多 sleeping 的数据库连接, 为什么还会出现 不能连接数据库 的问题呢??

答:

对于ADO.NET,它有一种机制,来分析是使用产生新的会话还是直接从链接池中返回,例如,不同的数据库链接,它会产生新的链接,而不会从原有链接池里返回。

而对于mssql,可能某种检测机制原因(不同的线程或进程链接),mssql分析后直接是为你产生新的链接,而不是从sleep状态的链接池返回,因此,原来的sleep无法复用,再次产生新的链接,就报链接池满了。

转载于:https://www.cnblogs.com/cyq1162/archive/2012/04/21/2460964.html

DataReader不奇怪,该出手时就出手!相关推荐

  1. 来自一位十余年工作经验的老电子工程师的心里话:该出手时便出手!

    来自一位十余年工作经验的老电子工程师的心里话:该出手时便出手! 这篇文章在网上流传很广,里面的观点尽管不全部正确,但无疑给人极大的深思...特抄录与此,努力反思与反醒... 诸位,咱当电子工程师也是十 ...

  2. 该出手时就出手,风风火火挂QQ

    QQ在线计划说明 原QQ在线时长计划公告 腾讯公司将于2005年8月15日推出新的QQ在线计划服务.通过累积活跃天数,您就可以获取相应的QQ等级.累积在线天数将有机会参加我们即将推出的奖励活动和享受相 ...

  3. 男生追美眉经验总结:关键时刻 该出手时就出手

    1.雨中即景:一天傍晚,晴朗的天空突降瓢泼大雨,我和她二人皆没带雨具,正巧,路旁便有一个电话亭. 心中念头:我拽着她跑进电话亭,只是发梢被雨水打湿了.在电话亭中我们四目相对-- (自我点评:此时无声胜 ...

  4. 该出手时就出手「深圳房价」基本上涨不跌

    自古以来,人们最关心的问题一直是他们自己的食物,衣服和住房.如今,随着社会的发展,这个技术发达的社会变得越来越方便和容易. 但是对于许多普通人来说,"生活"这个词仍然是一个真正的问 ...

  5. 总有一张图片会撩拨起你初恋时的心弦(转载)

    1男士比女士高半个头左右,温文尔雅:女士面带羞涩,温柔可人,一般人心目中的标准情侣,大多是这个样子的吧? 2.标准情侣(浪漫版) 男士搂住女士的小蛮腰,漫步在风景秀丽的湖边,笑谈人生,浪漫人心目中的标 ...

  6. 任正非接班人李一男离开华为时给属下的忠告

    李一男:1970年出生,湖南人,1992年,研究生第二年的时候在华为实习.1993年6月,毕业后即加入了华为.两天时间升任华为工程师.半个月升任主任工程师.半年升任中央研究部副总经理.两年被提拔为华为 ...

  7. 李一男离开华为时对下属说的话

    [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排, 绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了 ...

  8. 李一男离开华为时给属下的忠告

    [1]好好规划自己的路,不要跟着感觉走! 根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了 ...

  9. 李一男离开华为时的忠告

    [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了解 ...

最新文章

  1. 在Windows2003下搭建FTP服务器
  2. 用键盘上下左右键和ctrl键移动TreeView节点
  3. Android 文件布局一些细节备忘
  4. 【PC工具】图片批量添加水印工具,绿色免安装工具软件,妈妈再也不用担心我.....
  5. 从文件管理到获取洞见,AI 正在彻底变革企业内容管理
  6. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
  7. word 编辑域中的汉字_15条Word常用操作教程,简单实用,纯干货分享,收藏备用!...
  8. python表单处理_python flask 表单处理Flask-WTF
  9. java导出excel float_【Java】导入导出Excel表格
  10. 【博客管理】博客新建栏目的添加—HTML格式书写规范
  11. Matlab绘制柱状图, 设置figure的最大最小值
  12. 泰拉瑞亚服务器怎么修改密码,泰拉瑞亚账号系统功能使用说明 怎么绑定手机号...
  13. 基于Kaldi下babel项目的语音关键词检索(KWS)
  14. 用Python制作恋爱日志
  15. 3GPP TS 23501-g51 中英文对照 | 4.2.3 Non-roaming reference architecture
  16. 性能测试方案与性能测试报告目录导航
  17. android studio json格式化,Android json格式化显示,可展开与折叠
  18. Pytorch之经典神经网络CNN(七) —— GoogLeNet(InceptionV1)(Bottleneck)(全局平均池化GAP)(1*1卷积)(多尺度)(flower花卉数据集)
  19. android view clip,ClipView 自定义 RadiusView,包含常用的 Layout 和 View,方便扩展 @codeKK Android开源站...
  20. (PCB系列二)AD20添加元件3D库

热门文章

  1. python2clock_控制fps的时钟Clock类源码
  2. 《leetcode : 647. 回文子串 思考分析双指针解法》
  3. java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用
  4. 设置DVWA出现Could not connect to the MySQL service. Please check the config的解决方法,默认登录账号
  5. C语言模拟实现标准库函数之strlen()
  6. linux操作系统之读写锁
  7. 判断一段文件是UTF-8编码还是GB2312的编码方式
  8. 每日一题:leetcode456.132模式
  9. socket 编程篇六之IPO多路复用-select poll epoll
  10. Linux函数--inet_pton / inet_ntop