none
为什么 WCF数据服务+Entity 做简单查询速度会奇慢? RRS feed

  • 问题

  • 为什么 WCF数据服务+Entity 的访问方式 做简单查询速度会奇慢?

    是不是配置上有问题?

    求高人指点


    • 已编辑 loyodo 2012年1月17日 1:49
    2012年1月17日 1:45

答案

全部回复

  • 您好,关于性能问题,影响是多方面的,这不仅取决于您使用那种技术,同时取决于硬件的配置,项目的架构,数据量的大小等等很多因素。EF技术是对ADO.NET的一种封装,这样在简化了您对代码编写的同时有肯能会降低性能。这里有一个关于EF性能问题的文档,您可以参阅以下:性能注意事项(实体框架)


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月19日 2:17
    版主
  • 换个帐号继续我提出的问题。

    在原先提出的问题中,描述的并不清楚。其实我想讨论的并不是EF的性能,这点我已经考虑在方案之中了。

    而是WCF DataService的性能。

    我这先假设2种连接远程数据库的方案。

    第一种是用WCF DataService(承载在IIS7.0)将EF的实体对象在服务器端以OData的形式公布出来,在客户端直接对服务中的实体对象进行查询。

    第二种是直接在客户端通过数据库服务远程连接远端数据库,实体对象在客户端本地,只是连接字符串是服务名改成远端服务器名。然后在客户端对实体对象进行查询。

    两种方法查询的LINQ语句相同。但是查询速度差了几十倍。(已经除去实体对象初始化的时间。)

    据我所知,WCF DataService是在http上直接寻址的,加上Get,Post,时间自然会长一些,但是差那么多就让我感到诧异了。希望高人们能帮我解决下。具体内容我在另外一个帖子中有描述,以下为引用:

    我按照MSDN的讲解,自己实现了一个WCF Data Service。承载方式为默认,承载在IIS7.0上。以下是我WCF Data Service实现的关键代码片段以及web.config文件的内容。
    1.DataService类定义,其中 MyEntities 为直接从数据库生成的实体模型类,在此不贴代码。
    public class ContextCorpService : DataService<MyEntities>
    {
    public static void InitializeService(DataServiceConfiguration config)
    {
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
    }
    2.web.config内容。此文件是在工程中添加WCF Data Service自动生成的,除了connectionStrings,其实均没改过。
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <connectionStrings>
    <add name="ApplicationServices" connectionString="Data Source=localhost\timepro;Initial Catalog=TPV_My201112;Integrated Security =True;" providerName="System.Data.SqlClient" />
    <add name="MyEntities" connectionString="metadata=res://*/MyModel.csdl|res://*/ MyModel.ssdl|res://*/ MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\TIMEPRO;Initial Catalog=TPV_My201112;User ID=sa;Password=sakkkkk;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
    <system.web>
    <compilation debug="true" targetFramework="4.0">
    <assemblies>
    <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </assemblies>
    </compilation>
    <authentication mode="Forms">
    <forms loginUrl="~/Account/Login.aspx" />
    </authentication>
    <membership>
    <providers>
    <clear />
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
    </providers>
    </membership>
    <profile>
    <providers>
    <clear />
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
    </providers>
    </profile>
    <roleManager enabled="false">
    <providers>
    <clear />
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
    </providers>
    </roleManager>
    <pages clientIDMode="Predictable">
    </pages>
    </system.web>
    <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    </system.serviceModel>
    </configuration>
    Client在另外一台机器上测试,直接访问OData中的实体模型MyEntities,然后用Linq To Enity做了一句简单的单表查询,记录下执行查询到返回的时间,发现比直接通过SQL服务连远程数据库的查询速度慢了几十倍。个人认为速度不应该这么慢,可能是配置文件或者DataServiceConfiguration中设置不对,但是不知道原因,请大家帮忙看下。

     

    2012年1月20日 0:51
  • 您好,关于您的问题,建议您到这里来问,WCF论坛。希望您的问题能够早日得到解决。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us
    2012年2月3日 7:10
    版主