ShardMapManager和ShardMap对象应该作为单例全局缓存吗?

问题描述 投票:1回答:1

我有一个应用程序,其中包含一个按键分割的多个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;
}

我们只为所有分片使用一个分片映射和一个列表映射,所以我的问题是 - 我们可以将这些对象缓存在全局变量中吗?它们是否设计为线程安全,是否有助于提高性能?

更新

我在这里找到https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-shard-map-management#constructing-a-shardmapmanagerShardMapManager确实应该创建一次并存储在一个全局变量中。

但是ListShardMap怎么样?如果我们只有一个,我们也可以将它存储在全局变量中吗?

c# entity-framework azure-sql-database azure-elastic-scale azure-elastic-sharding
1个回答
0
投票

ShardMapManager包含一个映射缓存,如果我们有多个缓存,那么(a)由于重复,我们会消耗更多的内存,(b)我们总体上会得到更多的缓存未命中,这两者都会导致性能下降。所以我们想要一个单独的ShardMapManager,以便只有一个缓存副本。

ListShardMap包含对创建它的ShardMapManager的内部引用,以便它可以引用此缓存。如果从同一个ShardMapManager创建多个ListShardMap实例,它们都引用相同的缓存(在SMM内部),所以它完全没问题。

© www.soinside.com 2019 - 2024. All rights reserved.