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();