日期:2014-05-18  浏览次数:20342 次

有关sqldatareader的读取问题
sqldatareader在网页中的执行
是比较有效率和快的

问题:
在高并发的状况下,也就是同时多人访问,sqldatareader,会不会阻塞?(只考虑数据库只读的状况)
我搜索了一下网络,看到很多人说sqldatareader是独占?这个独占难道是独占一个表的读取权????
希望知道的朋友说一下,多谢
我现在解决一个只读的高并发查询问题,希望比较合适的方式访问数据库

------解决方案--------------------
每个sqldatareader都会占有一个connection,当数据库连接池满的时候(默认100个),也就是同时有100个用户打开connection并不关闭的时候就会出问题,所以只要保证用完连接马上关闭sqldatareader和connection就不会出问题。sqldatareader不会独占一个表的读取权。不过楼主的“高并发查询问题”最好不要用这个方法,应该将数据集缓存到应用服务器,这样会大大提高效率
------解决方案--------------------
楼上赞同
------解决方案--------------------
看到很多人说sqldatareader是独占?这个独占难道是独占一个表的读取权????

是独占一个连接~
------解决方案--------------------
个人感觉并不会是“独占一个表的读取权”,否则的话,太可笑了。
既然sqldatareader是只读的,那么就不应该自己独占着数据库。

------解决方案--------------------
sqldatareader是最快的读取了,如果这个还会占很多资源的话,那其他的就更占了。

除非你自己在循环利用sqldatareader读取数据的过程中有比较耗时的代码
------解决方案--------------------
其实不光是堵塞的问题.在项目中就遇到多个用户访问的时候,dataReader串位的问题。最后迫不得已给每个dataReader加上一个随机数与每个用户对应。
回到正题,搂主其实没有必要担心这种case,dataReader的访问速度是很快,不会霸占着表不放,是霸占着一个connection不放,不过connection会超时的,想霸占也不行。
------解决方案--------------------
其实也不是什么独占,原理是这样的,当然以下是我自己的理解不知道对不对,请楼主斟酌:

SqlDataReader连到数据库上是必须在Connection打开的情况下读取数据,是一直连接的,如果Connection关闭,那么SqlDataReader也就读不到数据了。而一个连接池中能同时并发的连接数量是有限的,一般默认是100,也就是说,如果同时有100个SqlDataReader在读取数据,那么第101个开始就会被阻塞,直到前100个中有一个断开第101个才会接管没有被占用的连接。所以写代码的时候,一旦SqlDataReader用完请记得立刻Close掉,而且要手动把Connection也Close掉,否则该连接会被一直占用,时间久了会因为各种各样的外部因素而将该连接变为死连接,到最后累积的效果就是连接池中所有可用连接全部用完,导致无法继续连接数据库。象这样的语句可以保证在作用域外部SqlDataReader returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);比如函数外部,将这个dr作为返回值交给其他函数使用的时候,在其他函数中只要Close了dr,那么该dr所占用Connection也会被关闭,但在本函数内部建立的连接请记得手动关闭掉它。

关于DataSet,DataSet与SqlDataReader不同,它可以使用既时连接,也就是Fill一个DataSet自动打开连接,Fill完毕之后这些数据在服务器内存中将以数据库镜象的形式存在,这个时候Connection会自动关闭,所以DataSet不占用连接。但是切记,如果在DataSet之前手动Connection.Open(),那么该连接必须在数据填充之后要手动关闭掉连接,否则该连接会同SqlDataReader一样一直占用直到死去。

由于数据库连接是非托管资源,所以CLR的垃圾回收器无法回收这种资源,所以请一定不要指望CLR回收它们。
------解决方案--------------------
只要通过connection连接,读取数据都要占用连接池的.....
------解决方案--------------------
只占用 connection,当然他的速度是最快的,
还是同意楼上的,如果读取的人太多,缓存起来把。