DataSet的数据填充也是通过DataReader得到的,那么为什么说DataReader会比DataSet占用更多的数据库连接时间呢?

YiYanXiYin 2005-07-07 01:23:00
DataSet的数据填充也是通过DataReader得到的,那么为什么说DataReader会比DataSet占用更多的数据库连接时间呢?
...全文
429 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
YiYanXiYin 2005-07-12
  • 打赏
  • 举报
回复
非常感谢frank_lee_cn(Frank)
感觉您有大师的风范,您的解答让在下受益匪浅,希望以后能再有机会得到您的帮助
到此结帖
Frank6600 2005-07-12
  • 打赏
  • 举报
回复
> 这样讲吧:如果一个sp执行需要1分钟,
> 那么dr去取这个sp的返回值肯定要占用1分钟的数据库连接时间,

> 如果这个时候也有一个用户需要执行这个sp,
> 这个用户如果用的也是同一个数据库连接

> 那么他必须等到前一个用户执行完那个sp,也就是不得不等待1分钟,
> 要是同时很多用户需要执行这个sp,这样就会等很久。

> 我的意思是这个时候就应该给每一个用户建立不同的数据库连接,
> 以便每一个用户的请求同步处理

想想,是我自己先离题。
没事离八年前干什么,
所谓「好汉不提当年勇」,
何况我不是好汉。

要说明的是,八年前在思考的问题,
是指这段关于SP执行、用户等待、同步处理、排队点餐等等的问题,
而不是主题所说DR,DS之类,
毕竟八年前还没有DotNet。

希望楼主结束这已离题的讨论。
Frank6600 2005-07-12
  • 打赏
  • 举报
回复
> 也许是以前看到一种设计方法将Connection定义成static的了吧,所以有此疑虑。
> 现在想想这种方式实在是画虎不成反类犬

嗯,Service 类的开发在某种情况下确实可共用 Connection,但不是好设计,而且必须使用 Lock 之类的技巧来隔离共用。我曾在不得已情况下使用过,之后一有机会便重写了。用「画虎不成反类犬」形容,贴切。

> frank_lee_cn(Frank)八年前就在想这个问题,令在下佩服之情油然而生,
> 冒昧的问一下frank_lee_cn是做何工作的?

呵,楼主离题了。
共勉!
YiYanXiYin 2005-07-12
  • 打赏
  • 举报
回复
> 如果这个时候也有一个用户需要执行这个sp,
> 这个用户如果用的也是同一个数据库连接,-----> 怎么可能﹖

的确是我想多了,默认情况一个用户一个连接,这样就不存在dr占用过多的数据库连接资源的问题了,因为多数情况对一个用户来说单线程操作就够了(这里的单线程仅仅针对ado.net)

也许是以前看到一种设计方法将Connection定义成static的了吧,所以有此疑虑,现在想想这种方式实在是画虎不成反类犬

frank_lee_cn(Frank)八年前就在想这个问题,令在下佩服之情油然而生,冒昧的问一下frank_lee_cn是做何工作的?
Frank6600 2005-07-12
  • 打赏
  • 举报
回复
你太客气,同勉。
HopeInDark 2005-07-11
  • 打赏
  • 举报
回复
to YiYanXiYin
ado.net的dataadapter对象是用datareader来填充dataset的,关键是dataadapter对象使用完datareader就关闭了连接,但是如果手工创建datareader的话,如果不手工关闭连接,连接是不会关闭的。
to lincai,
在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。实例化的对象必须实现 System.IDisposable 接口。所以你在使用的class中的Dispose方法要有conn.close()方法


Frank6600 2005-07-11
  • 打赏
  • 举报
回复
YiYanXiYin,

第一、你的问题在于比较 DS, DR 的「数据库连接时间」,这个「数据库连接时间」比较与 SP 无关。

第二、「用存储过程来处理数据,使用ds或dr就没有什么区别了」这不尽然,从ds/dr到显示资料,或许还有事要做。

第三、「如果不用存储过程的话,可以先将所有要处理的原始据库都读到ds中,然后再处理,那么这样就会比使用存储过程占用更少的数据库连接时间,这种方法是不是比使用存储过程更值得推荐呢?」答案是不尽然,存储过程被设计为擅长处理数据,在处理数据上,不论速度/能力/效率方面,都可能且应该比.Net语言好。且,若数据很大,你要把全部的数据都读到DS端﹖还是使用SP适当处理后再传送到DS端吧!李维(宝兰公司大中华区XX经理)曾说过,「让他们做擅长的事」。

第四、SP 的使用当然也会耗用资源,但前题是,你有问题必须解决,你难道只为了结省资源,而舍弃某个好用、必须用的功能吗﹖衡量「必须」与「节省」,你应该做选择。「你必须使用更高端的角度来看问题后再做选择」。更何况,SP 占用资源有可能比 DS 少(这点我不确定,但从想像来说,有可能)。

第五、DS/DR的选择也不是绝对的,适状况而定。
lincai 2005-07-11
  • 打赏
  • 举报
回复
谢谢frank_lee_cn,
还有一问题:

using(Class cls = new Class())
{
myCoder;
}
用以上方法,
这样就不用Conn.Close()了吗?
在Class中有Conn.Open()的。
HopeInDark 2005-07-11
  • 打赏
  • 举报
回复
建议楼主看看数据库的连接方式
Frank6600 2005-07-11
  • 打赏
  • 举报
回复
To 楼主,

八年前我也想过这个问题,
大约想了两年才想出好的办法。

但愿你可以想出不同于我的、但更好的解决办法。
Frank6600 2005-07-11
  • 打赏
  • 举报
回复
楼主,

加油,继续想想……
Frank6600 2005-07-11
  • 打赏
  • 举报
回复
> 这样讲吧:如果一个sp执行需要1分钟,
> 那么dr去取这个sp的返回值肯定要占用1分钟的数据库连接时间,

> 如果这个时候也有一个用户需要执行这个sp,
> 这个用户如果用的也是同一个数据库连接,-----> 怎么可能﹖

> 那么他必须等到前一个用户执行完那个sp,也就是不得不等待1分钟,
> 要是同时很多用户需要执行这个sp,这样就会等很久。

> 我的意思是这个时候就应该给每一个用户建立不同的数据库连接,
> 以便每一个用户的请求同步处理
YiYanXiYin 2005-07-11
  • 打赏
  • 举报
回复
想想这种方法也不好,就像排队打饭一样,要是不排队了,一窝蜂的上去更会乱套

所以我现在不知道如何是好。。。。。。
YiYanXiYin 2005-07-11
  • 打赏
  • 举报
回复
这样讲吧:如果一个sp执行需要1分钟,那么dr去取这个sp的返回值肯定要占用1分钟的数据库连接时间,如果这个时候也有一个用户需要执行这个sp,这个用户如果用的也是同一个数据库连接,那么他必须等到前一个用户执行完那个sp,也就是不得不等待1分钟,要是同时很多用户需要执行这个sp,这样就会等很久。我的意思是这个时候就应该给每一个用户建立不同的数据库连接,以便每一个用户的请求同步处理
Frank6600 2005-07-11
  • 打赏
  • 举报
回复
To 楼主,

老师除了教过即时(On time)处理,
还有教另外一种叫做批次(Batch)处理吧﹖! :)
Frank6600 2005-07-11
  • 打赏
  • 举报
回复
如果经常有存储过程「在连接/存取时」才长时间占用数据库连接资源,
那你的设计有问题。

为什么要在「连接/存取时」才執行「长时间处理」的SP呢﹖
不能在别的时候執行「长时间处理」的SP吗﹖
请你想一想。
YiYanXiYin 2005-07-11
  • 打赏
  • 举报
回复
如果一个存储过程长时间暂用数据库连接资源(这种情况经常有吧),那么是不是需要给每一个请求执行这个存储过程的用户建立一个新的连接呢?
Frank6600 2005-07-10
  • 打赏
  • 举报
回复
lincai,
处理完后,DS也会释放内存。
Frank6600 2005-07-10
  • 打赏
  • 举报
回复
lincai,
處理完後,DS也會釋放內存。
wxwx110 2005-07-10
  • 打赏
  • 举报
回复
DataSet是放在内存里的数据库缓存,相当于一个内存中的数据库 从数据库向填充完后它就不再站用数据库资源了,

dataReader需要的是在连接数据库的时候进行读取,要求保持数据库连接,所以dataREader站用的数据库资源比DATASET大
加载更多回复(21)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧