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


      通信量是说一次通信传输的数据量,可以使用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应该还算正常。这个也要考虑网络环境等外界因素。

  • 相关阅读:
    Matlab从入门到精通 Chapter5 数据可视化
    给source insight添加.cc的C++文件后缀识别
    机构研究报告
    配置Haproxy
    Ceph:一个 Linux PB 级分布式文件系统
    Centos安装源包出错Package xxx.rpm is not signed
    [虚拟机] 小实验: 使用KVM虚拟机,安装一个windows系统
    关于北京地铁通车计划
    python字符串和数字的基本运算符 valar
    python种类 valar
  • 原文地址:https://www.cnblogs.com/virusswb/p/1684112.html
Copyright © 2020-2023  润新知