gpt4 book ai didi

asp.net - Azure 弹性规模分片 key

转载 作者:行者123 更新时间:2023-12-03 01:53:37 26 4
gpt4 key购买 nike

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

经过一些测试和一些经验后,我爱上了它,它很简单,并且通过这种方法,代码保持干净且易于维护。

我只有一个大问题,分片键在哪里定义?我找不到从 Visual Studio 下载的示例的信息,但我可以肯定这是一个直接的答案。

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

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

提前致谢。

最佳答案

SQL 架构中的分片键与其用法(在代码中)之间没有显式链接。

因此,在入门示例中,Customers 和 Orders 表都包含 CustomerId 列,您可以在 DataDependentRoutingSample.cs 中看到,当我们访问这些表时,我们确保提供相同的 customerId 值赋给 shardMap.OpenConnectionForKey 方法,然后我们将其用于以下查询中的 customerId 列(在 SELECT 和 INSERT 语句中)。

// 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();
}

换句话说,当您在 OpenConnectionForKey 调用中提供某个键值时,您有责任确保使用该连接的所有 SQL 查询都限制为该键值,否则您可能会结束出现错误的结果(例如,如果它是 SELECT 查询)或行位于错误的分片上(例如,如果它是 INSERT 查询)。

可以通过使用新的行级安全功能来解决此安全问题。我们有一个名为 Entity Framework Multi-Tenant Shards 的样本演示了如何将分片映射与行级安全性相结合。相关代码在 ElasticScaleContext.cs :

SqlConnection conn = null; 
try
{
// Ask shard map to broker a validated connection for the given key
conn = shardMap.OpenConnectionForKey(shardingKey, connectionStr, ConnectionOptions.Validate);

// Set CONTEXT_INFO to shardingKey to enable Row-Level Security filtering
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SET CONTEXT_INFO @shardingKey";
cmd.Parameters.AddWithValue("@shardingKey", shardingKey);
cmd.ExecuteNonQuery();

return conn;
}
catch (Exception)
{
if (conn != null)
{
conn.Dispose();
}

throw;
}

感谢您提出的好问题!

关于asp.net - Azure 弹性规模分片 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com