2016-03-21 3 views
1

Wir verwenden die Microsoft.AnalysisServices-Bibliothek, um auf unsere SSAS-Datenbank (auf SQL Server 2014) zuzugreifen und Cubes programmatisch zu verarbeiten.Wie stoppen Sie die SSAS-Cube-Verarbeitung programmatisch?

Der Code sieht wie folgt aus:

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

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

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

Das Problem ist, Fullcube Verarbeitung eine lange Zeit (in unserem Fall über 1 h) in Anspruch nehmen. Und wir brauchen eine Möglichkeit, um sie bei Bedarf ordnungsgemäß zu stoppen/abzubrechen (der obige Code ist Teil eines komplexen Windows-Dienstes, der manchmal neu gestartet werden muss).

Es ist völlig akzeptabel, dass das Unterbrechen der Task dazu führt, dass der Cube nicht verarbeitet wird.

Gibt es eine Möglichkeit, den obigen Code zu schreiben, damit er nicht blockiert? Oder einen Callback irgendwie weitergeben? Ich kann nichts relevant in MSDN-Dokumentation finden:

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

+0

Ich bin nicht sicher, wie viel dies hilft Ihnen aber http://thinknook.com/kill-a-session-spid-or-connection-to-analysis-service -cube-2012-09-21/ist ein Artikel über das Töten von SSAS-Ausführung durch XMLA-Abfrage. – DiscipleMichael

+0

Wir verwenden XMLA-Abfragen für andere Cubes, die nicht im "Full" -Modus verarbeitet werden können. Bisher war es hier unnötig. Wenn es keine bessere Lösung gibt, werden wir den Code wahrscheinlich neu schreiben. Zumindest sollten wir in der Lage sein, die Arbeit nach jeder bearbeiteten Dimension zu unterbrechen. Es wird immer noch warten müssen, aber nicht 1h. –

+0

Wenn Sie den Dienst einfach neu starten, wird die Verarbeitung erfolgreich abgebrochen? Oder hängt es einfach? – GregGalloway

Antwort

0

können Sie versuchen immer des using Block befreien und Ihr server Objekt einer Klasse Level-Mitglied. Dann versuchen Sie diese auf dem Abbrechen thread:

server.CancelSession(server.SessionID); 
+0

Danke! Das funktioniert tatsächlich wie ein Zauber. Ich kann das gleiche Serverobjekt verwenden. Der Thread, der die Verarbeitung ausführt, wird dann die Ausnahme "Der Vorgang wurde vom Benutzer abgebrochen" auslösen, die ich fangen und weitermachen kann, wie ich es wünsche. Ich wurde mit der 'Database'-Klasse fixiert und dachte nicht daran, den' Server' zu überprüfen. –

+0

@MarcinSynak großartig! Bearbeitete meine Antwort, um es zu vereinfachen. Danke fürs Testen. – GregGalloway

Verwandte Themen