我正在构建一个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域服务的任何调用)。
有没有人可以协助我解决这些问题?我真的在努力让它发挥作用。
提前致谢, 干杯, 詹卢卡
答案 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行也是如此。
这就是全部。我希望这可以帮助别人。
干杯, 詹卢卡。