2016-03-21 1 views
1

Nous utilisons la bibliothèque Microsoft.AnalysisServices pour accéder à notre base de données SSAS (sur SQL Server 2014) et pour traiter les cubes par programme.Comment arrêter le traitement du cube SSAS par programme?

Le code ressemble à ceci:

using (var server = new Server()) 
{ 
    server.Connect("someserver"); 

    if (server.Connected) 
    { 
     var db = server.Databases.FindByName("somedb"); 

     if (db != null) 
     { 
      db.Process(ProcessType.ProcessFull); 
     } 
    } 
} 

Le problème est, le traitement complet du cube peut prendre beaucoup de temps (dans notre cas sur 1 h). Et nous avons besoin d'un moyen de l'arrêter ou de l'annuler si nécessaire (le code ci-dessus fait partie d'un service Windows complexe qui doit parfois être redémarré).

Il est tout à fait acceptable que l'interruption de la tâche entraîne la non-traitement du cube.

Existe-t-il un moyen d'écrire le code ci-dessus afin qu'il ne soit pas bloquant? Ou passer un rappel en quelque sorte? Je ne pouvais pas trouver quoi que ce soit pertinent dans la documentation MSDN:

https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.database.aspx

+0

Je ne sais pas à quel point cela vous aide, mais http://thinknook.com/kill-a-session-spid-or-connection-to-analysis-service -cube-2012-09-21/est un article sur l'exécution de Killing SSAS via une requête XMLA. – DiscipleMichael

+0

Nous utilisons des requêtes XMLA pour d'autres cubes, qui ne peuvent pas être traités en mode "Full". Jusqu'à présent, c'était inutile ici. S'il n'y a pas de meilleure solution, nous allons probablement réécrire le code. À tout le moins, nous devrions être en mesure d'interrompre le travail après chaque dimension traitée. Il faudra encore attendre, mais pas 1h. –

+0

Si vous redémarrez simplement le service, le processus est-il annulé? Ou est-ce que ça pend? – GregGalloway

Répondre

0

Pouvez-vous essayer de se débarrasser du bloc using et faire de votre objet server un membre de niveau de classe. Ensuite, essayez ceci sur le fil annuler:

server.CancelSession(server.SessionID); 
+0

Merci! Cela fonctionne réellement comme un charme. Je peux utiliser le même objet serveur. Le thread qui exécute le traitement lancera alors l'exception 'L'opération a été annulée par l'utilisateur' que je peux attraper et procéder comme je le souhaite. J'ai été obsédé par la classe 'Database' et je n'ai pas pensé à vérifier le' Server'. –

+0

@MarcinSynak génial! Edited ma réponse pour le simplifier. Merci de l'avoir testé. – GregGalloway