ShardMapManager.TryGetRangeShardMap 不会检索 RangeShardMap
ShardMapManager.TryGetRangeShardMap wont retrieve the RangeShardMap
我正在尝试使用 Microsoft here 提供的示例应用程序。
这适用于创建新数据库及其分片等。但是当我尝试使用单个分片将它连接到现有数据库时它失败了。
它有一个名为 ShardManagementUtils
的 class,它提供了以下方法从分片 azure 数据库中检索 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;
}
我的数据库中有一个分片,分片数据保存在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
table 并且其中包含分片映射信息。那为什么第一行不检索 RangShardMap
如果它已经存在?
我做错了什么。
非常感谢您的帮助。
这是我犯的一个愚蠢的错误。我正要 close
这个问题,但想到 post 我的错误,因为它可能对其他人有帮助。
调用这个函数的代码是这样的:
RangeShardMap<int> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<int>(shardMapManager, Configuration.ShardMapName);
注意 int
,它告诉分片键的类型。在我的例子中,UserId 是 long
所以 int
不起作用。
只需将上面的行更改为以下即可解决问题:)
RangeShardMap<long> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<long>(shardMapManager, Configuration.ShardMapName);
我正在尝试使用 Microsoft here 提供的示例应用程序。 这适用于创建新数据库及其分片等。但是当我尝试使用单个分片将它连接到现有数据库时它失败了。
它有一个名为 ShardManagementUtils
的 class,它提供了以下方法从分片 azure 数据库中检索 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;
}
我的数据库中有一个分片,分片数据保存在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
table 并且其中包含分片映射信息。那为什么第一行不检索 RangShardMap
如果它已经存在?
我做错了什么。 非常感谢您的帮助。
这是我犯的一个愚蠢的错误。我正要 close
这个问题,但想到 post 我的错误,因为它可能对其他人有帮助。
调用这个函数的代码是这样的:
RangeShardMap<int> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<int>(shardMapManager, Configuration.ShardMapName);
注意 int
,它告诉分片键的类型。在我的例子中,UserId 是 long
所以 int
不起作用。
只需将上面的行更改为以下即可解决问题:)
RangeShardMap<long> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<long>(shardMapManager, Configuration.ShardMapName);