2011-05-12 127 views
1

我遇到了WMI查詢的問題。 我使用WMI查詢來搜索和恢復BizTalk中的實例。 當沒有那麼多的實例時(所以當數據不那麼多時)查詢性能很好。 但是,當數據很大(約3000個實例)時,查詢需要大約6-10秒才能執行,這是不可容忍的。WMI性能查詢

守則如下:

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 ..

Thx!

+2

出於好奇,爲什麼你會得到這麼多的暫停實例?對於我來說,編寫一個腳本來重新啓動它們似乎很奇怪,因爲當您可能將重點放在導致它們首先被暫停的原因上時。 – aceinthehole 2011-05-12 17:34:43

回答

2

看起來您正在爲您的業務流程獲取所有服務實例,而不僅僅是暫停的服務實例。

嘗試添加以下到您查詢的WHERE子句,這樣只有暫停並返回暫停 - 不可恢復的服務實例:

and (ServiceStatus = 4 or ServiceStatus = 16) 
0

感謝您的答覆。 我得到那麼多暫停實例的原因有時是由設計決定的。 只要消息沒有按順序排列,編排就會暫停,直到前一條消息通過。 我找到了另一種方式來恢復情況下使用安裝與BizTalk的BizTalkOperations類:

BizTalkOperations operations = new BizTalkOperations(dataSource, initialCatalog); 

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

此代碼是更高性能,則WMI代碼(代碼更少^^):)

謝謝