DataReader不奇怪,该出手时就出手!
夜里三点多,刚完成微博粉丝精灵V3.763的微博升级,上来看看,刚看到一篇文章:【原】关于使用DataReader的一个很奇怪的问题,不应该用DataReader?
于是准备花点时间解答下,顺便为这个月增添一篇文章。
关于DataReader,以前写过一篇文章,可参考:DataReader 链接关闭解惑篇
下面将对原文,解答两个问题:
一: DataReader、DataTable、DataSet 的简单关系:
这里先取原文的第一句话:.net读取数据集有两种方式:DataSet 和 DataReader
解答:.net 的Command操作里,默认可以有三种返回:DataReader、DataTable、DataSet
这三者的简单关系为:
DataTable 一个容器,把DataReeader读到DataTable容器后关闭流。
DataSet 一个大容器,里面可放置多个DataTable。
因此开发者,首先要明白这三者的简单关系,才不至于乱猜。
二:数据库链接、链接池、close与dispose
这里再取原文的第N句话:在sqlserver(2000)中查看进程,有非常多的sleeping进程,直到最后打开页面,提示超时,说连接池满。
解答:默认mssql的链接数是有限的,大体在100多个,简单的说你可以open 100多次而不关闭,超过后再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不奇怪,该出手时就出手!相关推荐
- 来自一位十余年工作经验的老电子工程师的心里话:该出手时便出手!
来自一位十余年工作经验的老电子工程师的心里话:该出手时便出手! 这篇文章在网上流传很广,里面的观点尽管不全部正确,但无疑给人极大的深思...特抄录与此,努力反思与反醒... 诸位,咱当电子工程师也是十 ...
- 该出手时就出手,风风火火挂QQ
QQ在线计划说明 原QQ在线时长计划公告 腾讯公司将于2005年8月15日推出新的QQ在线计划服务.通过累积活跃天数,您就可以获取相应的QQ等级.累积在线天数将有机会参加我们即将推出的奖励活动和享受相 ...
- 男生追美眉经验总结:关键时刻 该出手时就出手
1.雨中即景:一天傍晚,晴朗的天空突降瓢泼大雨,我和她二人皆没带雨具,正巧,路旁便有一个电话亭. 心中念头:我拽着她跑进电话亭,只是发梢被雨水打湿了.在电话亭中我们四目相对-- (自我点评:此时无声胜 ...
- 该出手时就出手「深圳房价」基本上涨不跌
自古以来,人们最关心的问题一直是他们自己的食物,衣服和住房.如今,随着社会的发展,这个技术发达的社会变得越来越方便和容易. 但是对于许多普通人来说,"生活"这个词仍然是一个真正的问 ...
- 总有一张图片会撩拨起你初恋时的心弦(转载)
1男士比女士高半个头左右,温文尔雅:女士面带羞涩,温柔可人,一般人心目中的标准情侣,大多是这个样子的吧? 2.标准情侣(浪漫版) 男士搂住女士的小蛮腰,漫步在风景秀丽的湖边,笑谈人生,浪漫人心目中的标 ...
- 任正非接班人李一男离开华为时给属下的忠告
李一男:1970年出生,湖南人,1992年,研究生第二年的时候在华为实习.1993年6月,毕业后即加入了华为.两天时间升任华为工程师.半个月升任主任工程师.半年升任中央研究部副总经理.两年被提拔为华为 ...
- 李一男离开华为时对下属说的话
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排, 绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了 ...
- 李一男离开华为时给属下的忠告
[1]好好规划自己的路,不要跟着感觉走! 根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了 ...
- 李一男离开华为时的忠告
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些.那么,就需要慎重安排自己的轨迹.从哪个行业入手,逐渐对该行业深入了解 ...
最新文章
- 在Windows2003下搭建FTP服务器
- 用键盘上下左右键和ctrl键移动TreeView节点
- Android 文件布局一些细节备忘
- 【PC工具】图片批量添加水印工具,绿色免安装工具软件,妈妈再也不用担心我.....
- 从文件管理到获取洞见,AI 正在彻底变革企业内容管理
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
- word 编辑域中的汉字_15条Word常用操作教程,简单实用,纯干货分享,收藏备用!...
- python表单处理_python flask 表单处理Flask-WTF
- java导出excel float_【Java】导入导出Excel表格
- 【博客管理】博客新建栏目的添加—HTML格式书写规范
- Matlab绘制柱状图, 设置figure的最大最小值
- 泰拉瑞亚服务器怎么修改密码,泰拉瑞亚账号系统功能使用说明 怎么绑定手机号...
- 基于Kaldi下babel项目的语音关键词检索(KWS)
- 用Python制作恋爱日志
- 3GPP TS 23501-g51 中英文对照 | 4.2.3 Non-roaming reference architecture
- 性能测试方案与性能测试报告目录导航
- android studio json格式化,Android json格式化显示,可展开与折叠
- Pytorch之经典神经网络CNN(七) —— GoogLeNet(InceptionV1)(Bottleneck)(全局平均池化GAP)(1*1卷积)(多尺度)(flower花卉数据集)
- android view clip,ClipView 自定义 RadiusView,包含常用的 Layout 和 View,方便扩展 @codeKK Android开源站...
- (PCB系列二)AD20添加元件3D库
热门文章
- python2clock_控制fps的时钟Clock类源码
- 《leetcode : 647. 回文子串 思考分析双指针解法》
- java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用
- 设置DVWA出现Could not connect to the MySQL service. Please check the config的解决方法,默认登录账号
- C语言模拟实现标准库函数之strlen()
- linux操作系统之读写锁
- 判断一段文件是UTF-8编码还是GB2312的编码方式
- 每日一题:leetcode456.132模式
- socket 编程篇六之IPO多路复用-select poll epoll
- Linux函数--inet_pton / inet_ntop