Впервые я создаю обслуживаемый компонент .NET (COM +), и у меня возникают некоторые проблемы, связанные с масштабируемостью. Я протестировал его до 4000 пользователей, но он все еще не может превзойти производительность исходного решения.
Основная идея заключается в том, что COM + содержит статический класс, содержащий словарь в памяти, а ASP-страница вызывает компонент для извлечения объекта из словаря. В словаре одновременно может содержаться от 6000 до 12000 наименований.
Класс статического словаря выглядит следующим образом:
public class Menus
{
public static Dictionary<string, MenuPage> MenuPages { get; set; }
}
Класс ServicedComponent, доступный для COM +, выглядит следующим образом:
public class MenuManager : ServicedComponent
{
public MenuPage GetMenuPage(string PubCode, int Page)
{
MenuPage ReturnMenuPage;
Menus.MenuPages.TryGetValue(String.Concat(PubCode, Page.ToString()), out ReturnMenuPage);
return ReturnMenuPage;
}
}
И компонент COM + вызывается со страницы ASP, например, так ...
Dim MenuManager : Set MenuManager = Server.CreateObject("MenuManager.MenuManager")
Dim MenuPage : Set MenuPage = MenuManager.GetMenuPage(UCase(sBook), iPage)
If (Not MenuPage Is Nothing) Then
//Retrieve values from class
Else
Set MenuPage = Nothing
Set MenuManager = Nothing
Throw404()
End If
Set MenuPage = Nothing
Set MenuManager = Nothing
COM + работает как локальная служба, и в AssemblyInfo установлены следующие параметры:
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false, AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]
В одном экземпляре теста текущему решению требуется 0,03 секунды, а новому компоненту - 0,0003 секунды. Однако под нагрузкой он на самом деле работает хуже, чем оригинал.
Что мне действительно нужно знать, так это то, что я делаю так неправильно, что при масштабировании производительность не улучшается, как ожидалось!?!?!
Любая помощь будет оценена.