2

キーによって分割された複数の Azure SQL データベースを含むアプリケーションがあります。シャード データベース接続を開くたびに、ShardMapManager と ListShardMap を取得します。

public static ShardMapManager CreateOrGetShardMapManager(string shardMapManagerConnectionString)
{
    // Get shard map manager database connection string
    // Try to get a reference to the Shard Map Manager in the Shard Map Manager database. If it doesn't already exist, then create it.
    ShardMapManager shardMapManager = default(ShardMapManager);
    bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager);

    if (!shardMapManagerExists)
    {
        // The Shard Map Manager does not exist, so create it
        shardMapManager = ShardMapManagerFactory.CreateSqlShardMapManager(shardMapManagerConnectionString);
    }

    return shardMapManager;
}

public static ListShardMap<T> CreateOrGetListMap<T>(ShardMapManager shardMapManager, string shardMapName) 
{
    // Try to get a reference to the Shard Map.
    ListShardMap<T> shardMap = null;
    bool shardMapExists = shardMapManager.TryGetListShardMap(shardMapName, out shardMap);

    if (!shardMapExists)
    {
        // The Shard Map does not exist, so create it
        shardMap = shardMapManager.CreateListShardMap<T>(shardMapName);
    }

    return shardMap;
}

次に、シャード キーを に渡して接続を開きますOpenConnectionForKey()

public static DbConnection CreateShardConnection(int shardingKey, string connectionStr, string shardMapName)
{
    var shardMapManager = CreateOrGetShardMapManager(connectionStr);
    var shardMap = CreateOrGetListMap<int>(shardMapManager, shardMapName);
    SqlConnection conn = shardMap.OpenConnectionForKey<int>(shardingKey, GenerateCredentialsConnString(connectionStr), ConnectionOptions.Validate);
    return conn;
}

すべてのシャードに対して 1 つのシャード マップと 1 つのリスト マップのみを使用するので、私の質問は、これらのオブジェクトをグローバル変数にキャッシュできますか? それらはスレッドセーフになるように設計されていますか?それはパフォーマンスに役立ちますか?

アップデート

私はここでhttps://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-shard-map-management#constructing-a-shardmapmanagerShardMapManager実際に一度作成する必要があることを見つけましたグローバル変数に格納されます。

しかし、どうListShardMapですか?1 つしかない場合、それもグローバル変数に格納できますか?

4

1 に答える 1

1

ShardMapManager にはマッピングのキャッシュが含まれており、複数のキャッシュがある場合、(a) 重複のためにより多くのメモリを消費し、(b) 全体的により多くのキャッシュ ミスが発生し、どちらもパフォーマンスが低下します。したがって、キャッシュのコピーを 1 つだけ持つために、シングルトンの ShardMapManager が必要です。

ListShardMap には、それを作成した ShardMapManager への内部参照が含まれているため、このキャッシュを参照できます。同じ ShardMapManager から複数の ListShardMap インスタンスを作成する場合、それらはすべて同じキャッシュ (その SMM 内) を参照するので、まったく問題ありません。

于 2019-02-22T19:39:56.360 に答える