1

我遇到了 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 });

这是第一个查询(Select * from MSBS_ServiceInstance..),当数据变大时需要很长时间。

有什么想法可以改进吗?该平台是Windows Server 2008 Enterprise..

谢谢!

4

2 回答 2

2

看起来您正在获取编排的所有服务实例,而不仅仅是暂停的服务实例。

尝试将以下内容添加到查询的 where 子句中,以便只返回挂起和挂起不可恢复的服务实例:

and (ServiceStatus = 4 or ServiceStatus = 16)
于 2011-05-13T16:17:09.933 回答
0

感谢您的答复。有时我得到这么多暂停实例的原因是设计使然。每当一条消息不按顺序排列时,编排就会暂停,直到前一条消息通过。我找到了另一种使用 BizTalk 安装的 BizTalkOperations 类恢复实例的方法:

BizTalkOperations operations = new BizTalkOperations(dataSource, initialCatalog);

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

这段代码比 WMI 代码(和更少的代码 ^^)性能更高:)

谢谢

于 2011-06-06T14:12:19.867 回答