我遇到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 });
这是te数据越来越大的第一个查询(从MSBS_ServiceInstance中选择*)。
我有什么想法可以改善这个? 该平台是Windows Server 2008 Enterprise ..
THX!
答案 0 :(得分:2)
看起来您正在为您的业务流程获取所有服务实例,而不仅仅是已暂停的服务实例。
尝试将以下内容添加到查询的where子句中,以便仅返回暂停和暂停不可恢复的服务实例:
and (ServiceStatus = 4 or ServiceStatus = 16)
答案 1 :(得分:0)
感谢您的回复。 我得到那么多被暂停的实例的原因有时是设计的。 每当消息不按顺序排列时,业务流程将暂停,直到上一条消息通过。 我找到了另一种使用随BizTalk安装的BizTalkOperations类恢复实例的方法:
BizTalkOperations operations = new BizTalkOperations(dataSource, initialCatalog);
foreach (Guid id in instanceIds)
{
operations.ResumeInstance(id);
}
此代码比WMI代码(和更少的代码^^)更高效:)
由于