代码改变世界

.NET应用访问数据库之数据库的开销问题 后续篇(二)通信量和通信次数的较量

2010-03-12 11:55  Virus-BeautyCode  阅读(2296)  评论(7编辑  收藏  举报

 

  通信量是说一次通信传输的数据量,可以使用KB或者MB来衡量的量。通信次数是说一次打开数据库,执行数据库操作,然后返回数据(或者没有返回),算作一次通信。

  今天就这个问题在MSN中和几个人进行了交流,一个是MVP,一个是在群里,一个是和一位数据库方面的高手。具体内容如下:

  和MVP的交流内容,将MVP的姓名替换了。

  

代码
查看与此联系人的全部对话记录
  
MVP 说:
你看看对象定义应该就清楚了吧
 jorden008@hotmail.com 说:
用reflector
有这么个问题,通信量和通信次数,那个更重要呢?是一次通信的量大点,减少通信次数,
 还是每次通信量小点,通信次数多点没有关系呢
 来如何权衡呢
  
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
MVP 说:
 都重要
 一般远呈调用
 推荐做法是 少次数,多数据
 当然,这个数据量也不能太大
 jorden008@hotmail.com 说:
 远程调用是什么概念呢
MVP 说:
 不同机器
 不同进程
 jorden008@hotmail.com 说:
 我现在是一个互联网应用
 是不是就可以理解为远程调用呢?内网是不是不算远程调用了呢?
MVP 说:
 不是
 互联网应用时浏览器和服务器之间的调用
 远程调用
-----服务器之间的,ok?
 jorden008@hotmail.com 说:
 C
/S算不算远程调用呢
MVP 说:
 算
 jorden008@hotmail.com 说:
 那就是了,我现在是silverlight
+wcf,一种在浏览器中运行的C/S
MVP 说:
 恩,算是吧
 jorden008@hotmail.com 说:
 B
/S都是服务器在工作,在client端都是html
MVP 说:
 对的
 jorden008@hotmail.com 说:
 好的,谢谢建议兄
 具体这个量有没有什么大概的数值呢
 现在用httpwatch看的话,有100K之多
MVP 说:
 100K算正常吧
 jorden008@hotmail.com 说:
 大概多少算作上线呢
MVP 说:
 一般通讯量都算猪呢工程
 不知道
 凭经验
 jorden008@hotmail.com 说:
 猪??
 猪呢工程??

MVP 说:
 一般1M一下都算正常 吧
 jorden008@hotmail.com 说:
 主要是怕用户体验不好,响应的慢,好的谢谢
 还有就是互联网应用的数据库调用失败率大概多少呢
MVP 说:
 没这种说法吧
 jorden008@hotmail.com 说:
 因为有的时候本来可以在一个存储过程中搞一个事务的,但是担心失败,有一个是必须的,一个不是必须的,就想是不是应该分开了,不必须的失败了就算了,这样就造成了两次通信
 有的时候可以写一个存储过程,然后里面写上三个sql,一个事务搞定,但是怕失败,不敢了,就只要写三个存储过程,分三次调用
MVP 说:
 数据库?
 jorden008@hotmail.com 说:
 是的
MVP 说:
 三个存储过程也可以一个事物啊
 jorden008@hotmail.com 说:
 还是怕失败啊
MVP 说:
 事物失败不是正常的吗?
 不失败要事物干吗?
 jorden008@hotmail.com 说:
 原来一个事务怕失败,就搞成三个失误了
 我就是说这种失败的几率有多少呢
MVP 说:
 三个就不失败了?
 靠
 没这种说法吧
 jorden008@hotmail.com 说:
 这么说吧,第一个失败了,是业务不允许的,失败了就是要报错,客户要重新点击,但是第二个是记录日志,如果失败了,可以允许,客户就不用管的,只是给系统来用的
 但是这两个放在一个事务,是不是不好呢?
MVP 说:
 不好
 日志记录放在事物之外
 jorden008@hotmail.com 说:
 还有就是一些其他的,例如有一个表维护用户的最后通信时间,用来做超时自动下线的
 用户每次进行业务操作的时候,都会更新这张表 
 就说业务操作和更新在线用户表是不是该放在一个事务呢
MVP 说:
 这个也可以事物之外
 jorden008@hotmail.com 说:
 事务之外就变成两次通信了
MVP 说:
 不是
 你不是C
/S
 吗?
 C
/S要避免client和server的多次通讯
 jorden008@hotmail.com 说:
 C
/S就不是两次通信了吗
MVP 说:
 server 和db之间该怎么干就怎么干
 你不是在sliverlight中调ado吧?
 jorden008@hotmail.com 说:
 server是说application server吧
MVP 说:
 yes
 jorden008@hotmail.com 说:
 silveright也不让我调用ado啊
MVP 说:
 恩
 jorden008@hotmail.com 说:
 silveright不能直接连接数据库,只能通过服务,例如webservice、wcf这些东西
MVP 说:
 server和db的多次通讯不是用一个connection?
 clinet
-server 通讯次数要少
 jorden008@hotmail.com 说:
 server和db的多次通信应该不是一个吧
MVP 说:
 server
-db通讯次数要少
 但是,有时候性能跟功能是不可兼得的
 向你的场景,显然要用三次数据库通讯
 jorden008@hotmail.com 说:
 通信次数还是应该优先的,要少,就是在通信量允许的情况下,尽量减少通信次数,是不是可以这么理解呢
MVP 说:
 恩
 在功能允许的情况下,尽量减少通讯次数
 一般的业务,数据量问题可以忽略的,除非是一次加载大量数据的场景
 jorden008@hotmail.com 说:
 就想你说的1M应该可以算作正常
MVP 说:
 看什么场景
 没有绝对的标准
 jorden008@hotmail.com 说:
 视情况而定

 

  在群中的交流信息

  

代码
查看与此联系人的全部对话记录
  
  
 jorden008@hotmail.com 说:
 有这么个问题,通信量和通信次数,那个更重要呢?是一次通信的量大点,减少通信次数,
 还是每次通信量小点,通信次数多点没有关系呢
 来如何权衡呢

用户1 说:
 你的通信量大是不是说每次交互的时间很长啊
 要不然这两个应该是同一个概念啊
 jorden008@hotmail.com 说:
 不是的,是交互的数据量大,怕传输时间长,响应慢,显示就慢
 怎么会是一个概念呢
 一个是每次10M,就两次通信
 一个是每次1M,需要通信20词
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
用户1 说:
 那就一次10M啦,这样应该会比每次1M的快吧
 jorden008@hotmail.com 说:
 10M这个量如何控制呢,也许5M更合适吧,就是个问题
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
用户1 说:
 这个,没有太过经验.....
 呵呵
Mog 说:
 是数据传输粒度问题吧。我觉得小一点好,够客户端一次显示用就行了
 粒度大的话,我想会不会出现某时刻并发量过大,造成阻塞
 jorden008@hotmail.com 说:
 粒度小才会并发过大吧
 粒度小导致通信量增大,并发的几率就大了
用户1 说:
 这个可以采用一种折中的数据量啊
Mog 说:
 粒度大的话,处理时间长。
 jorden008@hotmail.com 说:
 对
 就是那个更优先一点
Mog 说:
 我想设计时把粒度控制设为可配置吧,根据以后运行环境来调整
Gary.Chen 说:
 Yo
 Yo Yo Yo
 jorden008@hotmail.com 说:
 不是什么都可以做成配置的
Gary.Chen 说:
 jorden哥
 jorden008@hotmail.com 说:
 我这个又不是硬件,做流量控制的
 这个是方法调用,然后传输实体类,如何配置呢
 what GaryChan
Gary.Chen 说:
 你在说什么
?分享一下
 jorden008@hotmail.com 说:
  有这么个问题,通信量和通信次数,那个更重要呢?是一次通信的量大点,减少通信次数,
 还是每次通信量小点,通信次数多点没有关系呢
 来如何权衡呢

Gary.Chen 说:
 看你应用场合了
 我碰到跟你一样的问题
 我昨天跟PM讨论过,采取了频繁请求来做
 但是我害怕频繁请求会导致通道故障,宿主会不会废掉
 我个人建议的做法是少量通信次数
+分段获取数据
 你可以用分段字节流来获取
 我这里有个demo,上次发过了
 Fred Xu.DBSC 说:
 demo在哪里可以下载
Gary.Chen 说:
 我上次发给过你们吧
 Fred Xu.DBSC 说:
 重发一下吧
Gary.Chen 说:
 ......
 这个是针对大数据量传输的解决方案
 jorden008@hotmail.com 说:
 哦
 请给我一个吧
 谢谢了
Gary.Chen 说:
 要的人发EMAIL
 Fred Xu.DBSC 说:
 fred_xu666@hotmail.com
 jorden008@hotmail.com 说:
 是不是那个拆解为byte【】,然后在客户端组合的办法呢
Gary.Chen 说:
 对


 

  和数据库开发方面的高手的交流内容

  

代码
查看与此联系人的全部对话记录
  
数据库开发高手 说:
现在硬件完全能应付的来
 jorden008@hotmail.com 说:
好吧,谢谢了,回头交流
数据库开发高手 说:
好的。
8
  
 jorden008@hotmail.com 说:
 有这么个问题,通信量和通信次数,那个更重要呢?是一次通信的量大点,减少通信次数,
 还是每次通信量小点,通信次数多点没有关系呢
 来如何权衡呢
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
数据库开发高手 说:
 这个都跟网络有关系吧

 感觉应该是量大点 

 jorden008@hotmail.com 说:
 因为是互联网应用,网络就是平均水平算
lye2000000_super@hotmail.com 说(
10:46):
 通信次数还要等待的

 jorden008@hotmail.com 说:
 通信次数要等待是什么意思
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
数据库开发高手 说:
 每次连接可能会等待啊

 jorden008@hotmail.com 说:
 哦,那就是说两者可以量优先,在量允许的范围内,尽量减少通信次数
数据库开发高手 说:
 对 

 jorden008@hotmail.com 说:
  还有就是互联网应用的数据库调用失败率大概多少呢
 因为有的时候本来可以在一个存储过程中搞一个事务的,但是担心失败,有一个是必须的,一个不是必须的,就想是不是应该分开了,不必须的失败了就算了,这样就造成了两次通信
加密助手 说:
 
--- 系统提示: 以下会话未被加密 ---
数据库开发高手 说:
 提交到服务器了。怎么会出现你说 情况呢?

 jorden008@hotmail.com 说:
 有的时候可以写一个存储过程,然后里面写上三个sql,一个事务搞定,但是怕失败,不敢了,就只要写三个存储过程,分三次调用
数据库开发高手 说:
 呵呵呵。怎么会这样呢?调要了存储过程了。那么就会一起执行。都是在数据里执行
 貌似这个是理解错了吧
 分三次出错 几率不是更大?

 jorden008@hotmail.com 说:
 这么说吧,第一个失败了,是业务不允许的,失败了就是要报错,客户要重新点击,但是第二个是记录日志,如果失败了,可以允许,客户就不用管的,只是给系统来用的
 但是这两个放在一个事务,是不是不好呢?

 还有就是一些其他的,例如有一个表维护用户的最后通信时间,用来做超时自动下线的
 用户每次进行业务操作的时候,都会更新这张表 
 就说业务操作和更新在线用户表是不是该放在一个事务呢

数据库开发高手 说:
 都放在存储过程里不就行了吗?

 提交之后都在服务器运行

 你说 这种状况很难出现吧

 运行着就出问题了。挺难出现 

 那样第一个存储过程也会出这种事情 
 jorden008@hotmail.com 说:
 所以我问题你存储过程出错的几率有多大呢?
数据库开发高手 说:
 呵呵。不会太大

 比网络出错 几率要小
 jorden008@hotmail.com 说:
 那就是小很多恶劣
数据库开发高手 说:
 是啊。
 如果要求不严格。那就分开。这个对整体影响不大 
 jorden008@hotmail.com 说:
 恩

 

 

  结论

  通信次数还是应该优先考虑的,要少,但是要在通信量允许的情况下,尽量减少通信次数,通信量1M应该还算正常。这个也要考虑网络环境等外界因素。