`

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

阅读更多

 

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

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

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

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->查看与此联系人的全部对话记录
  
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 说:
 视情况而定

 

  在群中的交流信息

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->查看与此联系人的全部对话记录
  
  
 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 说:
 对


 

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

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->查看与此联系人的全部对话记录
  
数据库开发高手 说:
现在硬件完全能应付的来
 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应该还算正常。这个也要考虑网络环境等外界因素。

分享到:
评论

相关推荐

    ADO.NET数据库访问技术案例教程

    本教程的案例部分将深入讲解以上知识点,并通过具体的代码示例,帮助学习者理解和应用ADO.NET进行数据库访问。案例涉及创建数据库连接、执行SQL查询、处理结果集、事务操作等多个方面,旨在提升实际编程能力。通过...

    封装好的.net连接各种数据库的类库

    标题中的"封装好的.net连接各种数据库的类库"指的是一个已经预设好接口和功能的代码集合,用于简化.NET应用程序与多种数据库系统的通信。 首先,让我们来看看支持的数据库类型: 1. OLEDB(Object Linking and ...

    基于.NET的oracle数据库访问程序

    本项目"基于.NET的Oracle数据库访问程序"利用C#实现了对Oracle数据库的全面操作,包括查询、修改、删除和插入数据。Oracle数据库是企业级的关系型数据库管理系统,广泛应用于大型企业和组织。 1. **C#语言基础**: ...

    使用.Net类库访问数据库

    通过理解和应用这些.NET类库,开发者可以在VC++中构建高效且可靠的数据库应用程序。无论是简单的CRUD操作还是复杂的业务逻辑,.NET框架都提供了强大的工具来满足需求。同时,随着Entity Framework等现代技术的发展,...

    基于.NET的数据库访问技术的优化研究

    综上所述,通过深入理解和应用.NET框架中的数据库访问技术,并结合性能优化策略,开发者能够在.NET平台上构建高效、稳定的数据处理系统。了解并掌握这些技术细节和优化技巧,对于提升.NET应用程序的整体性能至关重要...

    .net 数据库操作类库

    6. 连接池:数据库连接池技术能有效地管理和重用数据库连接,减少创建和销毁连接的开销,提高应用程序性能。 7. 事务处理:在进行多条数据库操作时,事务处理确保数据的一致性。.NET框架中的TransactionScope类可以...

    ASP.NET数据库链接文件

    ASP.NET是一种由微软开发的服务器端Web应用程序框架,主要用于构建动态网站、Web应用程序和Web服务。在ASP.NET中,数据库连接文件是实现数据驱动应用程序的关键组成部分,它允许开发者与各种数据库进行交互,如SQL ...

    .net C# 数据库访问层

    在.NET框架中,C#是主要的编程语言之一,用于构建各种类型的应用程序,包括Web应用程序。在ASP.NET中,数据库访问层(DAL)是应用程序架构中的关键组件,它负责处理与数据库的所有交互。本教程将重点介绍如何在...

    .NET深入体验与实战精要(数据库)

    《.NET深入体验与实战精要(数据库)》是一本专为.NET开发者设计的书籍,旨在帮助读者深入了解.NET框架在数据库交互方面的应用和优化。这本书的内容涵盖了从基础的数据库概念到高级的.NET数据访问技术,提供了丰富的...

    VB.NET编写的ORACLE数据库线程查询工具

    在IT领域,开发数据库查询工具是一项常见的任务,而VB.NET(Visual Basic .NET)作为.NET Framework的一部分,提供了强大的编程能力,使得开发者能够创建高效、用户友好的应用程序。本工具利用VB.NET进行开发,特别...

    ADO.net大数据量操作数据库实验

    在IT行业中,数据库操作是核心任务之一,尤其是在处理大数据量时。本实验“ADO.NET大数据量操作数据库实验”聚焦于如何高效地在SQL Server中存储和处理大量数据。实验环境基于Visual Studio 2015(VS2015)和SQL ...

    基于.NET技术的数据库技术与应用研究.docx

    ### 基于.NET技术的数据库技术与应用研究 #### 摘要 本文深入探讨了.NET技术在数据库技术中的应用及其对现代信息技术体系的影响。随着互联网和大数据时代的到来,传统数据库技术面临着诸多挑战,例如如何高效管理...

    vb.net连接数据库全集

    在VB.NET编程环境中,连接数据库是一项基础且至关重要的任务,特别是在开发数据驱动的应用程序时。VB.NET提供了多种方法来连接和操作SQL数据库,这使得开发者能够高效地与各种类型的数据库进行交互。以下是对"vb.net...

    Ado.Net数据库连接字符串大全

    本篇文章将深入探讨Ado.Net数据库连接字符串的使用,以及如何通过OLEDB和ODBC连接到不同的数据库。 首先,连接字符串是Ado.Net与数据库建立连接的关键,它包含了数据库服务器的地址、数据库名、用户名、密码等信息...

    c#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)

    ### c#.NET万能数据库访问封装类:ACCESS、SQLServer、Oracle 在现代软件开发中,数据持久化是至关重要的一个环节,而数据库操作作为数据持久化的基础,其效率和可维护性直接影响到整个应用程序的性能和稳定性。...

    asp.net连接数据库的代码

    ASP.NET是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和强大的性能,使得开发者能够轻松地创建交互式、数据驱动的Web应用。在ASP.NET中,连接数据库是常见的任务,这通常涉及到ADO.NET(一种.NET ...

    .net 连接mysql数据库源代码

    在.NET框架中,连接MySQL数据库通常需要借助于MySQL的...在你提供的压缩包文件“asp.net 连接mysql数据库”中,可能包含了实现这些功能的具体示例代码,通过学习和理解这些代码,可以加深对上述知识点的理解和应用。

    基于.net的web数据库设计实践教程

    5. **安全性与性能优化**:涵盖身份验证、授权、会话管理和状态管理,以及如何优化查询性能、减少数据库访问开销等策略。 6. **案例分析与实践项目**:提供实际的Web数据库应用程序示例,指导读者从设计、编码到...

    asp.net 全能数据库

    【asp.net 全能数据库】是一个专为ASP.NET平台设计的高效、全面的数据库解决方案,旨在简化Web应用程序中对数据库的访问和管理。这个组件集成了多种数据库操作功能,为开发者提供了一站式的数据库交互体验。 ASP...

    用ADO.NET2.0进行数据库应用程序开发

    ADO.NET 2.0是微软.NET Framework的一部分,它为开发者提供了高效、灵活的数据库访问机制,使得构建数据库驱动的应用程序变得更加简单。在本教程中,我们将深入探讨如何利用ADO.NET 2.0进行数据库应用程序开发。 1....

Global site tag (gtag.js) - Google Analytics