【问题标题】:Performance technique in mvc3 for fetch data with WCF Servicemvc3 中使用 WCF 服务获取数据的性能技术
【发布时间】:2011-10-21 14:25:56
【问题描述】:

我正在使用带有 Azure Web 角色的 asp.net mvc 3 WCF Web 服务 Entity Framework 4。这就是问题所在:

我有索引页面,我在其中以图块的形式显示用户列表。每个用户都关联了 20-30 多个群组,可能有 100 多个。但我只显示每块 2 组。参考这张图。

我在用户组映射表中有用户和组的映射 使用 userid 和 groupid 的 compisit 键。现在问题是我在索引页上添加了分页。并且客户要求是 list 应该是 statefull 。当我为每个用户获取列表时,我正在为列表和再次获取列表,所以看起来像这样 psudo

Get Users 
-> For each user
-> Add Div 
 -> For each User Group
   -> Get 2 Associated Groups to this User.
   -> Add Lable 
   -> Add Group Name

这样做是因为要求,列表应该是有状态的。因此,对于每个用户来说,遇到对服务器的请求以获取其组......确实是该架构的时间。由于使用 EF4,我猜 WFC 到 mvc 3 之间的数据事务很慢。我不能严格使用 Jquery.javascript。那么执行此操作的最佳方法应该是什么。一秒钟内。

【问题讨论】:

标签: wcf linq asp.net-mvc-3 entity-framework azure


【解决方案1】:

(您没有提到系统背后的后端存储;我假设它是 SQL Azure,但无论如何下面的讨论都将几乎相同。)

在调整此类应用程序的性能时,我发现记住两件事很重要:

  • 尽量减少每个请求中的查询数量和
  • 让数据库完成繁重的工作

特别是,对 SQL Azure 执行单个 SELECT 查询所花费的时间可能是几百毫秒。这表明您希望每个 HTTP 请求最多执行 10 到 15 次查询,以实现亚秒级响应时间。

解决此问题的一种方法是确保在尽可能少的数据库查询中查询所需的所有数据。这意味着您将通过 EF 一次性提取大量数据,但这通常没问题:在云中,查询执行可能很慢,但数据传输通常很快。

因此,例如,用 groupby 在服务器上执行单个更大的查询替换诸如迭代客户端上的集合之类的东西。

MiniProfiler http://code.google.com/p/mvc-mini-profiler/ 是一个非常有用的工具来分析您的应用程序和识别重复查询。

如果这仍然没有帮助,请考虑对您的数据进行非规范化处理。有很多方法可以解决这个问题:

  • 在服务器上创建一个附加表,当您更改数据时会重新填充该表:此表是显示网页时所需内容的平面表示
  • 使用在更改数据时填充的 Azure 表存储创建表:这可能会存储数据的序列化表示,然后可以使用 LINQ to XML 在内存中查询或排序
  • 在数据库上创建一个视图(不过,有时查询并没有真正的性能提升)

除了所需的开发时间和存储空间之外,这里最大的权衡是写入速度会变慢,因为需要更新非规范化表示。在这种情况下,使用辅助角色和 Azure 队列异步更新非规范化表示可能是合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多