积极答复者
为什么 WCF数据服务+Entity 做简单查询速度会奇慢?

问题
答案
-
- 已标记为答案 Allen_MSDNModerator 2012年2月6日 1:59
全部回复
-
您好,关于性能问题,影响是多方面的,这不仅取决于您使用那种技术,同时取决于硬件的配置,项目的架构,数据量的大小等等很多因素。EF技术是对ADO.NET的一种封装,这样在简化了您对代码编写的同时有肯能会降低性能。这里有一个关于EF性能问题的文档,您可以参阅以下:性能注意事项(实体框架)。
Allen Li [MSFT]
MSDN Community Support | Feedback to us
-
换个帐号继续我提出的问题。
在原先提出的问题中,描述的并不清楚。其实我想讨论的并不是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="Data Source=localhost\TIMEPRO;Initial Catalog=TPV_My201112;User ID=sa;Password=sakkkkk;MultipleActiveResultSets=True"" 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中设置不对,但是不知道原因,请大家帮忙看下。 -
- 已标记为答案 Allen_MSDNModerator 2012年2月6日 1:59