Запрос производительности WMI - PullRequest
1 голос
/ 12 мая 2011

У меня проблема с запросом WMI.Я использую запрос WMI для поиска и возобновления экземпляра в BizTalk.Когда экземпляров не так много (например, когда данных не так много), запрос выполняется довольно хорошо.Но когда данные большие (около 3000 экземпляров), выполнение запроса занимает от 6 до 10 секунд, и это недопустимо.

Код выглядит следующим образом:

string query = "SELECT * FROM MSBTS_ServiceInstance WHERE InstanceID = \"" + OrchestrationId + "\"";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(new ManagementScope(@"root\MicrosoftBizTalkServer"), new WqlObjectQuery(query), null);
    int count = searcher.Get().Count;
    if (count > 0)
    {
        string[] strArray = new string[count];
        string[] strArray2 = new string[count];
        string[] strArray3 = new string[count];
        string str2 = string.Empty;
        string str3 = string.Empty;
        int index = 0;
        foreach (ManagementObject obj2 in searcher.Get())
        {
            if (str2 == string.Empty)
            {
                str2 = obj2["HostName"].ToString();
            }
            strArray2[index] = obj2["ServiceClassId"].ToString();
            strArray3[index] = obj2["ServiceTypeId"].ToString();
            strArray[index] = obj2["InstanceID"].ToString();
            str3 = str3 + string.Format("  {0}\n", obj2["InstanceID"].ToString());
            index++;
        }
        new ManagementObject(string.Format("root\\MicrosoftBizTalkServer:MSBTS_HostQueue.HostName=\"{0}\"", str2)).InvokeMethod("ResumeServiceInstancesByID", new object[] { strArray2, strArray3, strArray, 1 });

Этопервый запрос (Выбрать * из MSBS_ServiceInstance ..), который занимает много времени, когда объем данных увеличивается.

Есть идеи, как мне это улучшить?Платформа - Windows Server 2008 Enterprise.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Похоже, что вы получаете все сервисные экземпляры для вашей оркестровки, а не только приостановленные.

Попробуйте добавить следующее в условие where вашего запроса, чтобы возвращались только приостановленные и приостановленные не возобновляемые сервисные экземпляры:

and (ServiceStatus = 4 or ServiceStatus = 16)
0 голосов
/ 06 июня 2011

Спасибо за ответы. Причина, по которой я получил, что многие приостановленные экземпляры иногда - это дизайн. Когда сообщение не находится в последовательности, оркестровка приостанавливается до тех пор, пока не пройдет предыдущее сообщение. Я нашел другой способ возобновить экземпляры, используя класс BizTalkOperations, который устанавливается вместе с BizTalk:

BizTalkOperations operations = new BizTalkOperations(dataSource, initialCatalog);

foreach (Guid id in instanceIds)
{
     operations.ResumeInstance(id);
}

Этот код гораздо более производительный, чем код WMI (и меньше кода ^^):)

Спасибо

...