大牛们晚上好,
    由于不了解WCF的我现在想急切了解一下WCF,并且欲用于项目之中。所以有以下些许疑问,期待得到热心的您的指点,谢谢!谢谢大家!1.使用WCF中间层缓存常用表数据,给Client频繁调用(非常频繁) 与 Client直接从SQL数据库查询该数据,二者在速度上有多大差距?
(我潜意识认为wcf会差太多,因为我测试从client调用wcf方法之计算两数之和,如此简单之功能,从调用到返回需要1秒时间。会不会太长?)2.wcf能否保持连接状态(会话),类似TCP三次握手,而不是http那样每次重来。(估计是废话问题)3.完!欢迎讨论!

解决方案 »

  1.   

    参考这里:http://www.cnblogs.com/artech/archive/2012/02/13/wcf-rest-conditional-retrieval.html
    缓存就需要在客户端,那样最好,服务端缓存没难度,自己搞个静态的字典,按照Key来缓存结果集,唯一需要关注的是内存消耗,如果内存消耗过多,需要及时情况,而客户端缓存性能就高多了。
      

  2.   


    我认为缓存在客户端不太明智,首先缓存数据是需要与数据库同步的,如果在客户端缓存那么所有客户端都要查询数据库,会浪费较多资源。 如果是中间层缓存数据,且wcf中间层与客户端通信速度非常快,那么维护中间层的缓存数据只需一次操作,多客户端共享使用。通常情况运行中间层服务的硬件内存资源足够大。现在关键问题是wcf传递1000行记录到客户端,和客户端直接从数据库select出1000行数据,二者相比差距有多少。据我所知wcf传递数据是用xml序列后传递,待客户端收到再反序列,这一来一回岂不是消耗时间更多?尽管此时中间层是从内存中取数据传递,而SQL数据库从硬盘取数据传递。
      

  3.   

    数据里弄一个更新时间属性,WCF方法里提交一个客户端时间,WCF返回所有用到的数据ID域需要更新的数据资料
      

  4.   

    一般情况下,如果数据库分配的内存足够大,那么直接查询数据库反而比使用WCF缓存更快,因为那时是数据库引擎帮我们进行了缓存。
    而你说的WCF序列化是最大的瓶颈,我在一篇帖子里已经对其质疑过了,参考:http://bbs.csdn.net/topics/390414590,其中30楼还有更详细的分析。
      

  5.   

    1. 如果你真的可以直接访问关系数据库,干么要用什么WCF呢?通常这是优先考虑业务环境约束的。例如有人开发一个游戏服务器,那么它可能暴露一个关系数据库api么?不可能。这时候它就需要自己定义自己的通讯协议,来提供api,这样他就能把握住服务接入技术的主动权。而如果你是把一个办公室里的小OA给弄到网上,那么你就给客户端直接提供关系数据库呗!反正这种网络软件也值不了几个钱。2. 很显然,WCF甚至web service,都是非常非常慢的。你做几个tcp或者http服务器程序就知道了。还是那句话,这个要看你的开发时是有现成专业的通讯程序、还是随便找个容易上手的就行。3. 尽管有人说WCF可以这个或者那个provider之类的,但是实际上没有几个人调通或者用好的。因此我们基本上可以认为WCF是基于http之上在慢个两三倍速度。所谓tcp三次握手,即使是http也是一样(毕竟http是基于tcp之上的)。但是如果你使用tcp,你可能是长连接的,也就是说仅需要在登录时握手,然后就可以并发地进行成千上万地双向通讯。而http不行。4. 完!
      

  6.   

    要具体情况具体分析,如果访问并发量不大而且查询不耗时,可以直接访问数据库,无需缓存,如果并发量很大,查询又耗时,缓存就体现出了他的价值,一次查询,重复使用,你可以看成O(1),而访问数据库基本就是O(n),n越大,就越慢,所以有缓存当然好,可以在不必要的情况下去加这么一个东西显然在增加成本.
      

  7.   


    不知你需要“保持连接状态”做啥事情?
    wcf到是有双工模式和asp.net兼容模式。
      

  8.   


    不知你需要“保持连接状态”做啥事情?
    wcf到是有双工模式和asp.net兼容模式。因为WebService每次收到新请求时都会重新去new 对象重新查询数据库,所以我担心wcf是否也是这样?不能将已经创建的对象保持在内存。
      

  9.   

    要具体情况具体分析,如果访问并发量不大而且查询不耗时,可以直接访问数据库,无需缓存,如果并发量很大,查询又耗时,缓存就体现出了他的价值,一次查询,重复使用,你可以看成O(1),而访问数据库基本就是O(n),n越大,就越慢,所以有缓存当然好,可以在不必要的情况下去加这么一个东西显然在增加成本.我也是这样认为的。
      

  10.   

    其实没太明白你的WCF中间层是干啥的? 感觉好象就是单纯的服务器?
    如果是这样,正如前面几位前辈所说,直接用Catch就好了呗?
      

  11.   

    WCF是什么?简单理解就是提供对外的服务接口。按协议开放的。没有这个需求你用他做什么
      

  12.   

    WCF缓存与SQL区别在于,一个开销是序列化,一个开销是读硬盘(缓存未命中的情况下)。
    抛开实际需求与运行环境,很难说清楚谁好谁差。