优化ASP.NET 2.0 Profile Provider

开发 后端
本文介绍优化ASP.NET 2.0 Profile Provider,如果在没有进行任何必要优化的情况下使用过它们,你的服务器将会因为业务量的增长而变得异常繁忙。

优化ASP.NET 2.0 Profile Provider

你可知道优化ASP.NET 2.0 Profile Provider中有两个能进行优化的重要存储过程吗?如果在没有进行任何必要优化的情况下使用过它们,你的服务器将会因为业务量的增长而变得异常繁忙。这里有一个故事:

在2006年3月份的MIX大会上展示了Pageflakes。当时我们是我们最富有魅力的时候。我们是作为支持Showcase of Atlas Web site的第一家公司。每天访问站点的用户数量接连攀升。有一天我们注意到,数据库服务器不再工作了。然后我们重新启动了服务器,工作恢复了正常,可过了一小时后,服务器再次死掉了。在我们对服务器主体部分进行了检查分析之后,我们发现CPU占用率高达100%并且IO使用率更高。

硬盘驱动器发热,并进行了自动关闭以保护其不受损坏。这对我们来说感到十分惊奇,因为我们原以为我们一直都很聪明,并且针对每个单独的Web服务功能都使用了 profile。因此,我们对上百兆的日志进行了分析希望能找到那个Web服务耗费了这么多时间。我们对其中一个产生了怀凝。它是加载用户页面配置的第一个功能。我们将这个功能分解成了很多小的部分以便我们能快速找到那一部分花费了大部分时间。

  1. private GetPageflake(string source, string pageID, string userUniqueName)  
  2. {  
  3. if( Profile.IsAnonymous )  
  4. {  
  5. using (new TimedLog(Profile.UserName,"GetPageflake"))  

正如你所看到的情形,整个方法主体就是用于计时。如果你想了解这种计时是如何工作的,我会在一篇新的文章中进行解释。我们也对其中一小部分我们怀凝最耗费资源的功能进行了计时。但是在我们的代码中需要花费大量时间处理的部分很多。我们的代码一直都是经过优化的(毕竟,你知道是谁在查看它,就是我)。

同时,用户开始了大叫,管理也开始混乱,支持部门的员工也开始抱怨这么多电话。开发人员搞得焦头乱额此时也变得胡言乱语。这并不是什么特殊情况,仅仅就是一个每个月会遇到2次的一个典型解决方案。

现在你一定在大声叫喊了,“你可以使用SQL Profiler啊,你这个傻瓜!”。问题是我们使用的是SQL Server工作组版本。不支持SQL Profiler这个功能。因此我们不得不采用我们的方法来解决这个问题,无论怎样也得使其在服务器上正常运行。不要问这个到底如何实现。在运行了SQL Profiler以后,孩子,真让我们吃惊!原来才是这个巨大的存储过程dbo.aspnet_Profile_GetProfiles给我们带来了痛苦!

我们习惯大量使用(并且一直使用)Profile provider这个工具。

  1. CREATE PROCEDURE [dbo].[aspnet_Profile_GetProfiles]  
  2.  @ApplicationName nvarchar(256),  
  3. @ProfileAuthOptions int,  
  4. @PageIndexint,  
  5. @PageSize int,  
  6. @UserNameToMatch nvarchar(256) = NULL,  
  7. @InactiveSinceDate datetime = NULL 
  8. AS  
  9. BEGIN  
  10. DECLARE @ApplicationId uniqueidentifier  
  11. SELECT @ApplicationId = NULL 
  12. SELECT @ApplicationIdApplicationId = ApplicationId  
  13. FROM aspnet_Applications  
  14. WHERE LOWER(@ApplicationName)  
  15. = LoweredApplicationName  
  16.  
  17.  IF (@ApplicationId IS NULL)  
  18. RETURN  
  19.  
  20.  -- Set the page bounds  
  21. DECLARE @PageLowerBound int  
  22. DECLARE @PageUpperBound int  
  23. DECLARE @TotalRecords int  
  24.  SET @PageLowerBound = @PageSize * @PageIndex  
  25.  SET @PageUpperBound = @PageSize - 1 + @PageLowerBound  
  26.  
  27. -- Create a temp table TO store the select results  
  28. CREATE TABLE #PageIndexForUsers  
  29. (  
  30. IndexId int IDENTITY (0, 1) NOT NULL,  
  31. UserId uniqueidentifier  
  32. )  
  33.  
  34. -- Insert into our temp table  
  35.  INSERT INTO #PageIndexForUsers (UserId)  
  36.  
  37. SELECT u.UserId  
  38. FROMdbo.aspnet_Users  
  39. u, dbo.aspnet_Profile p  
  40. WHERE ApplicationId = @ApplicationId  
  41. AND u.UserId = p.UserId  
  42. AND (@InactiveSinceDate  
  43. IS NULL OR LastActivityDate  
  44. <= @InactiveSinceDate)  
  45. AND (  
  46. (@ProfileAuthOptions = 2)  
  47. OR (@ProfileAuthOptions = 0 
  48. AND IsAnonymous = 1)  
  49. OR (@ProfileAuthOptions = 1 
  50. AND IsAnonymous = 0)  
  51. )  
  52. AND (@UserNameToMatch  
  53. IS NULL OR LoweredUserName  
  54. LIKE LOWER(@UserNameToMatch))  
  55. ORDER BY UserName  
  56.  
  57. SELECT u.UserName, u.IsAnonymous, u.LastActivityDate,  
  58. p.LastUpdatedDate, DATALENGTH(p.PropertyNames)  
  59. + DATALENGTH(p.PropertyValuesString)  
  60. + DATALENGTH(p.PropertyValuesBinary)  
  61. FROMdbo.aspnet_Users  
  62. u, dbo.aspnet_Profile p, #PageIndexForUsers i  
  63. WHERE  
  64. u.UserId = p.UserId  
  65. AND p.UserId = i.UserId  
  66. AND i.IndexId >= @PageLowerBound  
  67. AND i.IndexId <= @PageUpperBound  
  68.  
  69. DROP TABLE #PageIndexForUsers  
  70.  
  71. END  
  72. END 

以上是优化ASP.NET 2.0 Profile Provider。

【编辑推荐】

  1. 浅析ASP.NET中配置文件
  2. .NET RIA Services就像ASP.NET那样方便
  3. ASP.NET AJAX Extensions中UpdatePanel控件概述
  4. ASP.NET调用UpdatePanel的Update()方法
  5. 浅谈ASP.NET AJAX的WCF服务
责任编辑:佚名 来源: IT168
相关推荐

2009-07-21 10:40:36

ASP.NET Pro

2009-07-22 17:23:03

XmlDataSourASP.NET 2.0

2009-07-30 15:17:16

ASP.NET 2.0

2009-07-27 09:07:04

Profile SerASP.NET AJA

2009-01-07 11:38:22

ASP.NET.NET错误记录

2009-07-30 14:00:21

ASP.NET 2.0

2009-07-28 14:06:28

ASP.NET 2.0

2009-12-14 17:50:45

ASP.NET 2.0

2009-07-22 17:21:27

ASP.NET 2.0

2009-07-30 14:55:43

ASP.NET 2.0

2009-05-11 13:48:00

ASP.NET 2.0缓存效率

2009-07-21 14:16:02

ASP.NET管道优化

2009-08-04 17:16:16

ASP.NET代码优化

2009-07-27 16:53:15

ASP.NET 2.0

2010-06-25 08:51:46

ASP.NET MVC

2009-07-22 17:28:07

CSS文件ASP.NET 2.0

2009-07-21 15:27:12

ASP.NET 2.0

2009-12-11 16:28:23

ASP.NET 2.0

2009-07-23 16:28:20

URL映射ASP.NET 2.0

2009-07-23 14:25:03

ASP.NET 2.0
点赞
收藏

51CTO技术栈公众号