我们在SSAS中使用表格模型。作为每日立方体处理(Process Full)的一部分,ETL中有一个步骤,它会在多维数据集服务器上重新启动分析服务(以清除内存)。在这里,我们面临间歇性问题。分析服务停止但有时不会重新启动(5次中有2次)。我们收到的错误是
调用目标抛出了异常
所以有人必须登录服务器并手动启动服务。正如我所提到的,这个错误并不是每天都会发生的。
注意
我们在两个SSAS节点(2个物理负载平衡SSAS服务器)上有NLB,它们在多维数据集处理期间每天都会同步。上述错误发生在其中任何一个上。
重启SSAS的代码
public void Main()
{
Process[] processArray = Process.GetProcessesByName("MSSQLServerOLAPService", Dts.Variables["ProcessServerName"].Value.ToString());
foreach (Process process in processArray) //kill all instances of the SSAS process
{
process.Kill();
process.WaitForExit(); //wait for the process to be killed
}
ServiceController service = new ServiceController("MSSQLServerOLAPService", Dts.Variables["ProcessServerName"].Value.ToString());
if (service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending) //check to make sure the killed process resulted in a stopped service
{
service.Stop();
}
service.WaitForStatus(ServiceControllerStatus.Stopped);
service.Start(); //restart the SSAS service
Thread.Sleep(Convert.ToInt32(Dts.Variables["ServiceRestartDurationSeconds"].Value.ToString()) * 500);
service.WaitForStatus(ServiceControllerStatus.Running);
ConnectionManager cm = Dts.Connections["AW Cube Process"];
string connectionString = cm.ConnectionString.ToString();
AdomdConnection adomdConn = new AdomdConnection(connectionString);
adomdConn.Open(); //this kick starts loading the Tabular Model data into memory
Thread.Sleep(Convert.ToInt32(Dts.Variables["ServiceRestartDurationSeconds"].Value.ToString()) * 500);
Dts.TaskResult = (int)ScriptResults.Success;
}
问题
1)出现此错误的可能原因是什么?
2)重新启动分析服务的唯一原因是清除旧模型的内存并将表格模型重新加载到内存中。但如果可能的话,这是我们想要避免的。是否存在可以取代重新启动分析服务的更好的方法或解决方法?
如果您需要更多信息,请与我们联系。
谢谢!