Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:Azure SQL Database
Databeroende routning är möjligheten att använda data i en fråga för att dirigera begäran till en lämplig databas. Databeroende routning är ett grundläggande mönster när du arbetar med fragmenterade databaser. Begärandekontexten kan också användas för att dirigera begäran, särskilt om partitioneringsnyckeln inte är en del av frågan. Varje specifik fråga eller transaktion i ett program som använder databeroende routning är begränsad till åtkomst till en databas per begäran. För elastiska Azure SQL Database-verktyg utförs den här routningen med ShardMapManager klassen (Java, .NET).
Programmet behöver inte spåra olika anslutningssträngar eller DB-platser som är associerade med olika datasektorer i den fragmenterade miljön. I stället öppnar skalbara databaser med shard map manager anslutningar till rätt databaser vid behov, baserat på data i fragmentkartan och värdet för den horisontella nyckel som är målet för programmets begäran. Nyckeln är vanligtvis customer_id, tenant_id, date_key eller någon annan specifik identifierare som är en grundläggande parameter i databasbegäran.
Mer information finns i Skala ut SQL Server med Data-Dependent routning.
Ladda ned klientbiblioteket
Så här laddar du ned:
- Java-versionen av biblioteket finns i Maven Central Repository.
- .NET-versionen av biblioteket finns i NuGet.
Använda en ShardMapManager i ett databeroende routningsprogram
Program bör instansiera ShardMapManager under initieringen med hjälp av fabriksanropet GetSQLShardMapManager (Java, .NET). I det här exemplet initieras både en ShardMapManager och en specifik ShardMap som den innehåller. Det här exemplet visar metoderna GetSqlShardMapManager och GetRangeShardMap (Java, .NET).
ShardMapManager smm = ShardMapManagerFactory.getSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy);
RangeShardMap<int> rangeShardMap = smm.getRangeShardMap(Configuration.getRangeShardMapName(), ShardKeyType.Int32);
ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(smmConnectionString, ShardMapManagerLoadPolicy.Lazy);
RangeShardMap<int> customerShardMap = smm.GetRangeShardMap<int>("customerMap");
Använd autentiseringsuppgifter med lägsta möjliga behörighet för att hämta fragmentkartan
Om ett program inte manipulerar shardkartan själv bör autentiseringsuppgifterna som används i fabriksmetoden ha skrivskyddad behörighet för databasen Global Shard Map. Dessa autentiseringsuppgifter skiljer sig vanligtvis från autentiseringsuppgifter som används för att öppna anslutningar till shard map manager. Se även Autentiseringsuppgifter som används för att komma åt Elastic Database-klientbiblioteket.
Anropa metoden OpenConnectionForKey
Metoden ShardMap.OpenConnectionForKey (Java, .NET) returnerar en anslutning som är redo att utfärda kommandon till lämplig databas baserat på parameterns key värde. Shard-information cachelagras i programmet av ShardMapManager, så dessa begäranden omfattar vanligtvis inte en databassökning mot den globala Shard Map-databasen .
// Syntax:
public Connection openConnectionForKey(Object key, String connectionString, ConnectionOptions options)
// Syntax:
public SqlConnection OpenConnectionForKey<TKey>(TKey key, string connectionString, ConnectionOptions options)
- Parametern
keyanvänds som en uppslagsnyckel i fragmentkartan för att fastställa lämplig databas för begäran. -
connectionStringAnvänds för att endast skicka användarautentiseringsuppgifterna för den önskade anslutningen. Inget databasnamn eller servernamn ingår i den här connectionString eftersom metoden bestämmer databasen och servern med hjälp avShardMap. -
connectionOptions(Java, .NET) ska anges tillConnectionOptions.Validateom en miljö där shardkartor kan ändras och rader kan flyttas till andra databaser till följd av delade eller sammanslagningsåtgärder. Den här valideringen omfattar en kort fråga till den lokala fragmentkartan på måldatabasen (inte till den globala fragmentkartan) innan anslutningen levereras till programmet.
Om verifieringen mot den lokala fragmentkartan misslyckas (vilket indikerar att cachen är felaktig) frågar Shard Map Manager den globala fragmentkartan för att hämta det nya korrekta värdet för sökningen, uppdatera cachen och hämta och returnera lämplig databasanslutning.
Använd ConnectionOptions.None endast när ändringar i shardmappning inte förväntas när ett program är online. I så fall kan cachelagrade värden antas alltid vara korrekta, och det extra valideringsanropet till måldatabasen kan hoppas över på ett säkert sätt. Det minskar databastrafiken.
connectionOptions Kan också anges via ett värde i en konfigurationsfil för att ange om partitioneringsändringar förväntas eller inte under en tidsperiod.
I det här exemplet används värdet för en heltalsnyckel CustomerIDmed hjälp av ett ShardMap objekt med namnet customerShardMap.
int customerId = 12345;
int productId = 4321;
// Looks up the key in the shard map and opens a connection to the shard
try (Connection conn = shardMap.openConnectionForKey(customerId, Configuration.getCredentialsConnectionString())) {
// Create a simple command that will insert or update the customer information
PreparedStatement ps = conn.prepareStatement("UPDATE Sales.Customer SET PersonID = ? WHERE CustomerID = ?");
ps.setInt(1, productId);
ps.setInt(2, customerId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
int customerId = 12345;
int newPersonId = 4321;
// Connect to the shard for that customer ID. No need to call a SqlConnection
// constructor followed by the Open method.
using (SqlConnection conn = customerShardMap.OpenConnectionForKey(customerId, Configuration.GetCredentialsConnectionString(), ConnectionOptions.Validate))
{
// Execute a simple command.
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"UPDATE Sales.Customer
SET PersonID = @newPersonID WHERE CustomerID = @customerID";
cmd.Parameters.AddWithValue("@customerID", customerId);cmd.Parameters.AddWithValue("@newPersonID", newPersonId);
cmd.ExecuteNonQuery();
}
Metoden OpenConnectionForKey returnerar en ny redan öppen anslutning till rätt databas. Anslutningar som används på det här sättet drar fortfarande full nytta av anslutningspooler.
Metoden OpenConnectionForKeyAsync (Java, .NET) är också tillgänglig om programmet använder asynkron programmering.
Integrera med tillfällig felhantering
En bra metod för att utveckla dataåtkomstprogram i molnet är att se till att tillfälliga fel fångas upp av appen och att åtgärderna görs flera gånger innan ett fel uppstår. Tillfällig felhantering för molnprogram beskrivs i Tillfälliga felhantering (Java, .NET).
Hantering av tillfälliga fel kan samexistera naturligt med Data-Dependent Routning-mönstret. Det viktigaste kravet är att försöka utföra hela begäran om dataåtkomst igen, inklusive användningsblocket som hämtade den databeroende routningsanslutningen. Föregående exempel kan skrivas om på följande sätt.
Exempel – databeroende routning med tillfällig felhantering
int customerId = 12345;
int productId = 4321;
try {
SqlDatabaseUtils.getSqlRetryPolicy().executeAction(() -> {
// Looks up the key in the shard map and opens a connection to the shard
try (Connection conn = shardMap.openConnectionForKey(customerId, Configuration.getCredentialsConnectionString())) {
// Create a simple command that will insert or update the customer information
PreparedStatement ps = conn.prepareStatement("UPDATE Sales.Customer SET PersonID = ? WHERE CustomerID = ?");
ps.setInt(1, productId);
ps.setInt(2, customerId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
});
} catch (Exception e) {
throw new StoreException(e.getMessage(), e);
}
int customerId = 12345;
int newPersonId = 4321;
Configuration.SqlRetryPolicy.ExecuteAction(() -> {
// Connect to the shard for a customer ID.
using (SqlConnection conn = customerShardMap.OpenConnectionForKey(customerId, Configuration.GetCredentialsConnectionString(), ConnectionOptions.Validate))
{
// Execute a simple command
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"UPDATE Sales.Customer
SET PersonID = @newPersonID
WHERE CustomerID = @customerID";
cmd.Parameters.AddWithValue("@customerID", customerId);
cmd.Parameters.AddWithValue("@newPersonID", newPersonId);
cmd.ExecuteNonQuery();
Console.WriteLine("Update completed");
}
});
Paket som krävs för att implementera tillfällig felhantering laddas ned automatiskt när du skapar exempelprogrammet för elastisk databas.
Transaktionskonsekvens
Transaktionsegenskaper garanteras för alla åtgärder som är lokala för en shard. Till exempel körs transaktioner som skickas via databeroende routning inom omfånget för målshard för anslutningen. För närvarande finns det inga funktioner för att registrera flera anslutningar i en transaktion, och därför finns det inga transaktionsgarantier för åtgärder som utförs över shards.
Nästa steg
Relaterat innehåll
Använder du inte elastiska databasverktyg än? Kolla in vår komma igång-guide. För frågor kan du kontakta oss på Microsoft Q&En frågesida för SQL Database och för funktionsförfrågningar, lägga till nya idéer eller rösta på befintliga idéer i SQL Database-feedbackforumet.