Gegevensafhankelijke routering gebruiken om een query naar een geschikte database te routeren

Van toepassing op: Azure SQL Database

Gegevensafhankelijke routering is de mogelijkheid om de gegevens in een query te gebruiken om de aanvraag naar een geschikte database te routeren. Gegevensafhankelijke routering is een fundamenteel patroon bij het werken met shard-databases. De aanvraagcontext kan ook worden gebruikt om de aanvraag te routeren, met name als de shardingsleutel geen deel uitmaakt van de query. Elke specifieke query of transactie in een toepassing die gegevensafhankelijke routering gebruikt, is beperkt tot toegang tot één database per aanvraag. Voor de elastische hulpprogramma's van Azure SQL Database wordt deze routering uitgevoerd met de klasse ShardMapManager (Java, .NET).

De toepassing hoeft geen verschillende verbindingsreeks s of DB-locaties bij te houden die zijn gekoppeld aan verschillende segmenten gegevens in de shard-omgeving. In plaats daarvan opent Shard-toewijzingsbeheer verbindingen met de juiste databases wanneer dat nodig is, op basis van de gegevens in de shard-toewijzing en de waarde van de shardingsleutel die het doel is van de aanvraag van de toepassing. De sleutel is doorgaans de customer_id, tenant_id, date_key of een andere specifieke id die een fundamentele parameter van de databaseaanvraag is.

Zie SQL Server uitschalen met gegevensafhankelijke routering voor meer informatie.

De clientbibliotheek downloaden

Om te downloaden:

Een ShardMapManager gebruiken in een gegevensafhankelijke routeringstoepassing

Toepassingen moeten de ShardMapManager instantiëren tijdens de initialisatie met behulp van de factory-aanroep GetSQLShardMapManager (Java, .NET). In dit voorbeeld worden zowel een ShardMapManager als een specifieke ShardMap die deze bevat geïnitialiseerd. In dit voorbeeld ziet u de methoden GetSqlShardMapManager en 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"); 

Gebruik de referenties voor laagste bevoegdheden die mogelijk zijn voor het verkrijgen van de shard-toewijzing

Als een toepassing de shardtoewijzing zelf niet bewerkt, moeten de referenties die in de factorymethode worden gebruikt, alleen-lezenmachtigingen hebben voor de globale Shard-toewijzingsdatabase . Deze referenties verschillen doorgaans van referenties die worden gebruikt om verbindingen met shard-toewijzingsbeheer te openen. Zie ook referenties die worden gebruikt voor toegang tot de elastic database-clientbibliotheek.

De methode Open Verbinding maken ionForKey aanroepen

De methode ShardMap.Open Verbinding maken ionForKey (Java, .NET) retourneert een verbinding die gereed is voor het uitgeven van opdrachten naar de juiste database op basis van de waarde van de sleutelparameter. Shard-gegevens worden in de cache opgeslagen in de toepassing door ShardMapManager, dus deze aanvragen hebben meestal geen databasezoekactie voor de globale Shard-toewijzingsdatabase.

// Syntax:
public Connection openConnectionForKey(Object key, String connectionString, ConnectionOptions options)
// Syntax:
public SqlConnection OpenConnectionForKey<TKey>(TKey key, string connectionString, ConnectionOptions options)
  • De sleutelparameter wordt gebruikt als zoeksleutel in de shard-toewijzing om de juiste database voor de aanvraag te bepalen.
  • De connectionString wordt gebruikt om alleen de gebruikersreferenties voor de gewenste verbinding door te geven. Er is geen databasenaam of servernaam opgenomen in deze connectionString , omdat de methode de database en server bepaalt met behulp van de ShardMap.
  • De connectionOptions (Java, .NET) moeten worden ingesteld op Verbinding maken ionOptions.Validate als een omgeving waarin shard-toewijzingen kunnen veranderen en rijen naar andere databases kunnen worden verplaatst als gevolg van splits- of samenvoegbewerkingen. Deze validatie omvat een korte query naar de lokale shardtoewijzing op de doeldatabase (niet naar de globale shard-toewijzing) voordat de verbinding aan de toepassing wordt geleverd.

Als de validatie voor de lokale shard-toewijzing mislukt (wat aangeeft dat de cache onjuist is), voert Shard-toewijzing een query uit op de globale shard-toewijzing om de nieuwe juiste waarde voor de zoekactie te verkrijgen, de cache bij te werken en de juiste databaseverbinding te verkrijgen en te retourneren.

Gebruik Verbinding maken ionOptions.None alleen wanneer er geen shardtoewijzingswijzigingen worden verwacht terwijl een toepassing online is. In dat geval kunnen de waarden in de cache worden verondersteld altijd correct te zijn en kan de extra retourvalidatieaanroep naar de doeldatabase veilig worden overgeslagen. Dit vermindert het databaseverkeer. De connectionOptions kunnen ook worden ingesteld via een waarde in een configuratiebestand om aan te geven of er shardingwijzigingen worden verwacht of niet gedurende een bepaalde periode.

In dit voorbeeld wordt de waarde van een klant-id van een geheel getal gebruikt, met behulp van een ShardMap-object met de naam 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();
}  

De methode Open Verbinding maken ionForKey retourneert een nieuwe al geopende verbinding met de juiste database. Verbinding maken ionen die op deze manier worden gebruikt, profiteren nog steeds optimaal van verbindingspooling.

De methode Open Verbinding maken ionForKeyAsync (Java, .NET) is ook beschikbaar als uw toepassing asynchrone programmering gebruikt.

Integreren met tijdelijke foutafhandeling

Een best practice bij het ontwikkelen van toepassingen voor gegevenstoegang in de cloud is ervoor te zorgen dat tijdelijke fouten door de app worden onderschept en dat de bewerkingen meerdere keren opnieuw worden geprobeerd voordat er een fout wordt gegenereerd. Tijdelijke foutafhandeling voor cloudtoepassingen wordt besproken bij Transient Fault Handling (Java, .NET).

Tijdelijke foutafhandeling kan op natuurlijke wijze worden gebruikt met het patroon Gegevensafhankelijke routering. De belangrijkste vereiste is om de volledige aanvraag voor gegevenstoegang opnieuw uit te voeren, inclusief het gebruiksblok dat de gegevensafhankelijke routeringsverbinding heeft verkregen. Het voorgaande voorbeeld kan als volgt worden herschreven.

Voorbeeld: gegevensafhankelijke routering met tijdelijke foutafhandeling

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");
    }
});

Pakketten die nodig zijn om tijdelijke foutafhandeling te implementeren, worden automatisch gedownload wanneer u de voorbeeldtoepassing voor elastische databases bouwt.

Transactionele consistentie

Transactionele eigenschappen worden gegarandeerd voor alle bewerkingen lokaal naar een shard. Transacties die worden verzonden via gegevensafhankelijke routering, worden bijvoorbeeld uitgevoerd binnen het bereik van de doelshard voor de verbinding. Op dit moment zijn er geen mogelijkheden beschikbaar voor het inschakelen van meerdere verbindingen in een transactie en daarom zijn er geen transactionele garanties voor bewerkingen die worden uitgevoerd in shards.

Volgende stappen

Als u een shard wilt loskoppelen of een shard opnieuw wilt koppelen, raadpleegt u De RecoveryManager-klasse gebruiken om problemen met de shard-toewijzing op te lossen.

Aanvullende bronnen

Gebruikt u nog geen hulpprogramma's voor elastische databases? Bekijk de handleiding Aan de slag. Neem voor vragen contact met ons op op de microsoft Q&A-vragenpagina voor SQL Database en voor functieaanvragen, voeg nieuwe ideeën toe of stem op bestaande ideeën in het feedbackforum van SQL Database.