ここでMicrosoft が提供するサンプル アプリをいじってみます。これは、新しいデータベースとそのシャードなどの作成には問題なく機能しますが、単一のシャードを持つ既存の DB に接続しようとすると失敗します。
という名前のクラスがあり、シャードされた Azure データベースからShardManagementUtils
取得する次のメソッドを提供します。RangeShardMap<T>
/// <summary>
/// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
/// </summary>
public static RangeShardMap<T> CreateOrGetRangeShardMap<T>(ShardMapManager shardMapManager, string shardMapName)
{
// Try to get a reference to the Shard Map.
RangeShardMap<T> shardMap;
bool shardMapExists = shardMapManager.TryGetRangeShardMap(shardMapName, out shardMap);
if (shardMapExists)
{
ConsoleUtils.WriteInfo("Shard Map {0} already exists", shardMap.Name);
}
else
{
// The Shard Map does not exist, so create it
shardMap = shardMapManager.CreateRangeShardMap<T>(shardMapName);
ConsoleUtils.WriteInfo("Created Shard Map {0}", shardMap.Name);
}
return shardMap;
}
私のデータベースには 1 つのシャードがあり、シャーディング データは に保持されGlobal Shard Map (GSM)
ます。このメソッドを正しいShardMapManager
とを渡して呼び出すとshardMapName
、次のようになります。
//this return FALSE, it should not
bool shardMapExists = shardMapManager.TryGetRangeShardMap(shardMapName, out shardMap);
//Then this line throw exception that map with this name already exists
shardMap = shardMapManager.CreateRangeShardMap<T>(shardMapName);
スローされる例外は次のとおりです。
An unhandled exception of type 'Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.ShardManagementException' occurred in Microsoft.Azure.SqlDatabase.ElasticScale.Client.dll
Additional information: Shard map with name 'UserId' already exists in the store. Error occurred while executing stored procedure '__ShardManagement.spAddShardMapGlobal' for operation 'CreateRangeShardMap'.
テーブルを確認したところ、__ShardManagement.ShardMapsGlobal
シャード マップ情報が含まれていました。RangShardMap
では、最初の行が既に存在する場合、なぜ最初の行が取得されないのでしょうか?
私は何を間違っていますか。あなたの助けに感謝します。