504在RIA域服务中具有大结果集

时间:2011-03-29 12:09:30

标签: c# entity-framework ria wcf-ria-services

我正在构建一个RIA域服务,需要在包含大量数据的表上执行查询。 通过努力,我意识到表格大小可能是一个问题。

例如:

return this.ObjectContext.Logs;

以504错误失败,而:

return this.ObjectContext.Logs.Take(10);

的工作原理。

正如您所看到的,我正在处理一个日志表,其中包含一个字段“username”。我需要从表中检索所有不同的用户名。所以我设置了这个方法:

public IEnumerable<string> GetUsers()
    {
        var users = (from l in this.ObjectContext.Logs
                    select l.Username).Distinct().Take(10);

        return users;
    }

我正在尝试在服务器端执行所有必要的操作,以便将传输的信息(和相对延迟)减少到最小。

但是,即使使用该查询,我也会收到504错误。在Fiddler中,我看到:“ReadResponse()失败:服务器没有为此请求返回响应。”

最初我认为这是一个传输问题(传输数据的大小可能太大了),所以我在“返回用户”上设置了一个断点。我运行代码,调试器停在“返回用户”行。我点击了“结果视图”,但此时它无法显示任何结果,只显示错误。

我想在这里报告错误,但突然Visual Studio不再停止在DomainService断点上,只停止在Silverlight项目的断点上。我实际上正在调查这个,因为它似乎不再调用域服务(fiddler不再显示对ria域服务的任何调用)。

有没有人可以协助我解决这些问题?我真的在努力让它发挥作用。

提前致谢, 干杯, 詹卢卡

2 个答案:

答案 0 :(得分:1)

您可以选择Ria服务的响应大小: 编辑配置文件:(maxItemsInObjectGraph)

<system.serviceModel>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
      multipleSiteBindingsEnabled="true" />
    <services>
      <service name="ModuleDossier.DSDossier" behaviorConfiguration="DSDossier_BehaviorConfig"></service>      
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DSDossier_BehaviorConfig">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
        <behavior name="DSDossier_BehaviorConfig1">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

答案 1 :(得分:0)

好的,过了一会儿,我在这里提供一个自己问题的答案。

RIA或EF等没有任何问题。长时间操作会达到时间和大小限制,这是正常和正确的。在我的例子中,我们讨论的是一个包含32M行的表。

我们正在使用PostgreSQL 9.0。该表已被索引,但当返回的行数增加时,不使用索引。为了克服我们遇到的性能问题,我们对数据库和应用程序进行了重大的重构。表已经分区,创建了带计数器的支持表,现在已经用它们代替COUNT操作,启用了自动真空,增加了所有最有意义和最常用的搜索字段的索引数量,并且 - 重要 - 查询了为了减少返回的记录集。

新的应用程序在开发环境(只有少量可用资源)上运行,在几秒钟内就可以响应任何请求,即使数据库每月增长2-4M行也是如此。

这就是全部。我希望这可以帮助别人。

干杯, 詹卢卡。