Azure弹性比例分片键

时间:2015-05-04 10:05:22

标签: asp.net azure azure-elastic-scale

我正在将我的数据模型移动到Azure Elastic Sc​​ale。

经过一些测试和一些经验之后我会爱上它,它很简单,而且采用这种方法,代码仍然干净,易于维护。

我只有一个大问题,在哪里定义Sharding键?我无法找到从Visual Studio下载的示例的信息,我可以打败这是一个直截了当的答案。

在Microsoft提供的示例中,默认的分片键是 CustomerId ,但我找不到对该键的引用的位置。

它可以在配置文件的ShardMapName中吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

SQL模式中的分片键与其用法(代码中)之间没有明确的链接。

因此,在Getting Started示例中,Customers和Orders表都包含CustomerId列,您可以在DataDependentRoutingSample.cs中看到,当我们访问这些表时,我们确保提供相同的{{1}在以下查询中,我们随后用于customerId列(在SELECT和INSERT语句中)的customerId方法的值。

shardMap.OpenConnectionForKey

换句话说,当您在// Looks up the key in the shard map and opens a connection to the shard using (SqlConnection conn = shardMap.OpenConnectionForKey(customerId, credentialsConnectionString)) { // Create a simple command that will insert or update the customer information SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @" IF EXISTS (SELECT 1 FROM Customers WHERE CustomerId = @customerId) UPDATE Customers SET Name = @name, RegionId = @regionId WHERE CustomerId = @customerId ELSE INSERT INTO Customers (CustomerId, Name, RegionId) VALUES (@customerId, @name, @regionId)"; cmd.Parameters.AddWithValue("@customerId", customerId); cmd.Parameters.AddWithValue("@name", name); cmd.Parameters.AddWithValue("@regionId", regionId); cmd.CommandTimeout = 60; // Execute the command cmd.ExecuteNonQuery(); } 调用中提供某个键值时,您有责任确保具有该连接的所有SQL查询都限制为该键值,否则您最终可能会出错结果(例如,如果它是SELECT查询)或生成在错误分片上的行(例如,如果它是INSERT查询)。

可以通过使用新的行级安全功能来解决此安全问题。我们有一个名为Entity Framework Multi-Tenant Shards的示例,它演示了如何将Shard Maps与行级安全性结合起来。相关代码位于ElasticScaleContext.cs

OpenConnectionForKey

谢谢你的好问题!