2

ここで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では、最初の行が既に存在する場合、なぜ最初の行が取得されないのでしょうか?

私は何を間違っていますか。あなたの助けに感謝します。

4

1 に答える 1

4

これは私の側からのばかげた間違いでした。私はcloseこの質問をしようとしていましたが、他の誰かに役立つかもしれないので、ここに私の間違いを投稿することを考えました.

この関数を呼び出すコードは次のようになります。

RangeShardMap<int> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<int>(shardMapManager, Configuration.ShardMapName);

intシャーディング キーのタイプを示す に注意してください。私の場合、 UserId はlongそうでintはありません。

上記の行を次のように変更するだけで問題が解決しました:)

RangeShardMap<long> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<long>(shardMapManager, Configuration.ShardMapName);
于 2015-06-11T12:27:52.857 に答える