Teilen über


Vergleichen der horizontal skalierten Replikate von Semantikmodellen

In diesem Artikel finden Sie einige Visual Studio-App-Beispiele für den Vergleich von Semantikmodelleigenschaften, wenn die horizontale Skalierung für Power BI-Semantikmodelle aktiviert ist.

Die REST-API syncStatus zeigt, ob das Semantikmodelle mit Lese-/Schreibzugriff und schreibgeschützte Replikate synchronisiert sind. Sie können auch TOM (Tabular Object Model, Tabellenobjektmodell) verwenden, um eine benutzerdefinierte Anwendung zu erstellen, die eine Verbindung mit beiden Semantikmodellen herstellt und Zeitstempel, Metadaten und Abfrageergebnisse zwischen diesen vergleicht.

App 1: Überprüfen der Objekteigenschaften der Datenbank

Verwenden Sie den folgenden Code, um eine App zu erstellen, die die Eigenschaften LastUpdate, LastProcessed und LastSchemaUpdate Ihrer Semantikmodelle überprüft. Bevor die App die Überprüfungen durchführt, muss sie die Methode Refresh() aufrufen, um die Metadaten des Replikats abzurufen.

Ersetzen Sie <WorkspaceUrl> durch die URL Ihres Arbeitsbereichs und <Semantic modelName> durch den Namen Ihres Semantikmodells.

string workspaceUrl = "<WorkspaceUrl>";  // Replace <WorkspaceUrl> with the URL of your workspace
string datasetName = "<Semantic modelName>";  // Replace <Semantic modelName> with the name of your semantic model 
using (var workspace_readwrite = new Microsoft.AnalysisServices.Tabular.Server()) 
using (var workspace_readonly = new Microsoft.AnalysisServices.Tabular.Server()) 
{
    workspace_readwrite.Connect(workspaceUrl + "?readwrite"); 
    workspace_readonly.Connect(workspaceUrl + "?readonly"); 
    var datasetRW = workspace_readwrite.Databases.FindByName(semantic modelName); 
    var datasetRO = workspace_readonly.Databases.FindByName(semantic modelName); 

    if (datasetRW == null || datasetRO == null) 
    { 
        throw new ApplicationException("Database cannot be found!"); 
    }
    datasetRW.Refresh(); 
    datasetRO.Refresh(); 
    Console.WriteLine($"LastUpdated: {datasetRW.LastUpdate} (readwrite) {datasetRO.LastUpdate} (readonly)"); 
    Console.WriteLine($"LastProcessed: {datasetRW.LastProcessed} (readwrite) {datasetRO.LastProcessed} (readonly)"); 
    Console.WriteLine($"LastSchemaUpdate: {datasetRW.LastSchemaUpdate} (readwrite) {datasetRO.LastSchemaUpdate} (readonly)\n"); 
} 
Console.WriteLine("Test completed. Press any key to exit."); 
Console.Read(); 

App 2 – Vergleichen der Metadaten des Semantikmodells

Verwenden Sie den folgenden Code, um die Metadaten des primären Semantikmodells mit Lese-/Schreibzugriff mit den Metadaten des schreibgeschützten Replikats zu vergleichen: Ersetzen Sie <WorkspaceUrl> durch die URL Ihres Arbeitsbereichs und <DatasetName> durch den Namen Ihres Semantikmodells.

string workspaceUrl = "<WorkspaceUrl>";  // Replace <WorkspaceUrl> with the URL of your workspace 
string datasetName = "<DatasetName>";  // Replace <DatasetName> with the name of your semantic model 
using (var workspace_readwrite = new Microsoft.AnalysisServices.Tabular.Server()) 
using (var workspace_readonly = new Microsoft.AnalysisServices.Tabular.Server()) 
{ 
    workspace_readwrite.Connect(workspaceUrl + "?readwrite"); 
    workspace_readonly.Connect(workspaceUrl + "?readonly"); 
    var datasetRW = workspace_readwrite.Databases.FindByName(datasetName); 
    var datasetRO = workspace_readonly.Databases.FindByName(datasetName); 

    if (datasetRW == null || datasetRO == null) 
    { 
        throw new ApplicationException("Database cannot be found!"); 
    } 

    string tmslRW = Microsoft.AnalysisServices.Tabular.JsonSerializer.SerializeDatabase(datasetRW); 
    string tmslRO = Microsoft.AnalysisServices.Tabular.JsonSerializer.SerializeDatabase(datasetRO); 

    if (tmslRW != tmslRO) 
    { 
        Console.WriteLine("The replicas are out of sync.\n"); 
    } 
    else 
    { 
        Console.WriteLine("The replicas are in sync.\n"); 
    } 
} 
Console.WriteLine("Test completed. Press any key to exit."); 
Console.Read(); 

App 3 – Abfragen der Semantikmodelldaten

Verwenden Sie ADOMD.NET zum Abfragen der Daten in den Replikaten. Ersetzen Sie <WorkspaceUrl> durch die URL Ihres Arbeitsbereichs und <DatasetName> durch den Namen Ihres Semantikmodells.

string workspaceUrl = "<WorkspaceUrl>";  // Replace WorkspaceUrl with the URL of your workspace 
string datasetName = "<DatasetName>";  // Replace DatasetName with the name of your semantic model 
string daxQuery = "Evaluate SUMMARIZECOLUMNS(RefreshTimeTable[Time])"; 
using (var connectionRW = new Microsoft.AnalysisServices.AdomdClient.AdomdConnection()) 
using (var connectionRO = new Microsoft.AnalysisServices.AdomdClient.AdomdConnection()) 
{ 
    connectionRW.ConnectionString = $"Data Source={workspaceUrl}?readwrite;Catalog={datasetName}"; 
    connectionRO.ConnectionString = $"Data Source={workspaceUrl}?readonly;Catalog={datasetName}"; 
    connectionRW.Open(); 
    connectionRO.Open(); 
    var cmd = new Microsoft.AnalysisServices.AdomdClient.AdomdCommand(daxQuery); 
    string resultRW = string.Empty; 
    string resultRO = string.Empty; 
    cmd.Connection = connectionRW; 
    using (var reader = cmd.ExecuteReader()) 
    { 
        while (reader.Read()) 
        { 
            resultRW = reader.GetString(0); 
        } 
    } 

    cmd.Connection = connectionRO; 
    using (var reader = cmd.ExecuteReader()) 
    { 
        while (reader.Read()) 
        { 
            resultRO = reader.GetString(0); 
        } 
    } 

    if (resultRW != resultRO) 
    { 
        Console.WriteLine("The replicas are out of sync.\n"); 
    } 
    else 
    { 
        Console.WriteLine("The replicas are in sync.\n"); 
    } 
} 
Console.WriteLine("Test completed. Press any key to exit."); 
Console.Read();