의미 체계 모델 스케일 아웃 복제본 비교
이 문서에서는 Power BI 의미 체계 모델 스케일 아웃을 사용할 때 의미 체계 모델 속성을 비교하기 위한 몇 가지 Visual Studio 앱 예제를 제공합니다.
syncStatus
REST API는 읽기-쓰기 의미 체계 모델과 읽기 전용 복제본이 동기화되어 있는지 보여 줍니다. 또한 TOM(테이블 형식 개체 모델)을 사용하여 두 의미 체계 모델에 연결하고 둘 사이의 타임스탬프, 메타데이터 및 쿼리 결과를 비교하는 사용자 지정 애플리케이션을 빌드할 수 있습니다.
앱 1 - 데이터베이스 개체 속성 확인
아래 코드를 사용하여 의미 체계 모델의 LastUpdate, LastProcessed 및 LastSchemaUpdate 속성을 확인하는 앱을 빌드합니다. 앱이 검사를 수행하기 전에 복제본의 메타데이터를 가져오기 위해 Refresh()
메서드를 호출해야 합니다.
<WorkspaceUrl>
을(를) 작업 영역의 URL로 바꾸고 <Semantic modelName>
을(를) 의미 체계 모델의 이름으로 바꿉니다.
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();
앱 2 - 의미 체계 모델의 메타데이터 비교
아래 코드를 사용하여 기본 읽기-쓰기 의미 체계 모델의 메타데이터를 읽기 전용 복제본의 메타데이터와 비교합니다. <WorkspaceUrl>
을(를) 작업 영역의 URL로 바꾸고 <DatasetName>
을(를) 의미 체계 모델의 이름으로 바꿉니다.
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();
앱 3 - 의미 체계 모델 데이터 쿼리
ADOMD.NET
을 사용하여 복제본의 데이터를 쿼리합니다. <WorkspaceUrl>
을(를) 작업 영역의 URL로 바꾸고 <DatasetName>
을(를) 의미 체계 모델의 이름으로 바꿉니다.
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();