Lekérdezések megfelelő adatbázisba való átirányítása adatfüggő útválasztással

A következőre vonatkozik: Azure SQL Database

Az adatfüggő útválasztás az a képesség, hogy a lekérdezés adataival átirányítsa a kérést egy megfelelő adatbázisba. Az adatfüggő útválasztás alapvető minta a horizontálisan skálázott adatbázisok használatakor. A kérés környezete a kérés átirányítására is használható, különösen akkor, ha a horizontális skálázási kulcs nem része a lekérdezésnek. Az adatfüggő útválasztást használó alkalmazások minden egyes lekérdezése vagy tranzakciója kérelemenként egy adatbázishoz való hozzáférésre korlátozódik. Az Azure SQL Database rugalmas eszközei esetében ezt az útválasztást a ShardMapManager (Java, .NET) osztály hajtja végre.

Az alkalmazásnak nem kell nyomon követnie a különböző adatszeletekhez társított különböző kapcsolati sztring vagy ADATBÁZIS-helyeket a szegmenses környezetben. Ehelyett a szegmenstérkép-kezelő szükség esetén megnyitja a megfelelő adatbázisok kapcsolatait a szegmenstérkép adatai és az alkalmazás kérésének célként megadott skálázási kulcs értéke alapján. A kulcs általában a customer_id, tenant_id, date_key vagy az adatbázis-kérés alapvető paramétere.

További információ: SQL Server horizontális felskálázása adatfüggő útválasztással.

Az ügyfélkódtár letöltése

Letöltés:

ShardMapManager használata adatfüggő útválasztási alkalmazásban

Az alkalmazásoknak példányosítaniuk kell a ShardMapManagert az inicializálás során a GetSQLShardMapManager (Java, .NET) gyári hívással. Ebben a példában egy ShardMapManager és egy adott ShardMap is inicializálva lesz. Ez a példa a GetSqlShardMapManager és a GetRangeShardMap (Java, .NET) metódusokat mutatja be.

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

A szegmenstérkép lekéréséhez használja a lehető legalacsonyabb jogosultsági hitelesítő adatokat

Ha egy alkalmazás nem módosítja magát a szegmenstérképet, a gyári metódusban használt hitelesítő adatoknak írásvédett engedélyekkel kell rendelkezniük a globális szegmenstérkép-adatbázisban . Ezek a hitelesítő adatok általában eltérnek a szegmenstérkép-kezelővel való kapcsolatok megnyitásához használt hitelesítő adatoktól. Lásd még az Elastic Database ügyfélkódtár eléréséhez használt hitelesítő adatokat.

Az Open Csatlakozás ionForKey metódus meghívása

A ShardMap.Open Csatlakozás ionForKey metódus (Java, .NET) egy olyan kapcsolatot ad vissza, amely készen áll parancsok kiadására a megfelelő adatbázisba a kulcsparaméter értéke alapján. A szegmensinformációkat a ShardMapManager gyorsítótárazza az alkalmazásban, így ezek a kérések általában nem tartalmaznak adatbázis-keresést a globális szegmenstérkép-adatbázishoz.

// Syntax:
public Connection openConnectionForKey(Object key, String connectionString, ConnectionOptions options)
// Syntax:
public SqlConnection OpenConnectionForKey<TKey>(TKey key, string connectionString, ConnectionOptions options)
  • A rendszer keresési kulcsként használja a kulcsparamétert a szegmenstérképen a kérés megfelelő adatbázisának meghatározásához.
  • A connectionString csak a kívánt kapcsolat felhasználói hitelesítő adatainak átadására szolgál. A connectionString nem tartalmaz adatbázisnevet vagy kiszolgálónevet, mivel a metódus a ShardMap használatával határozza meg az adatbázist és a kiszolgálót.
  • A connectionOptions (Java, .NET) beállítása Csatlakozás ionOptions.Ellenőrizze, hogy a szegmenstérképeket tartalmazó környezet megváltozhat-e, és a sorok áttérhetnek-e más adatbázisokra felosztási vagy egyesítési műveletek eredményeként. Ez az ellenőrzés egy rövid lekérdezést tartalmaz a céladatbázis helyi szegmenstérképére (nem a globális szegmenstérképre), mielőtt a kapcsolat az alkalmazáshoz érkezni fog.

Ha a helyi szegmenstérkép ellenőrzése sikertelen (ami azt jelzi, hogy a gyorsítótár helytelen), a szegmenstérkép-kezelő lekérdezi a globális szegmenstérképet, hogy megkapja a keresés új helyes értékét, frissítse a gyorsítótárat, és szerezze be és adja vissza a megfelelő adatbázis-kapcsolatot.

Használja Csatlakozás ionOptions.Nincs csak akkor, ha a szegmensleképezés nem várható, amíg egy alkalmazás online állapotban van. Ebben az esetben feltételezhető, hogy a gyorsítótárazott értékek mindig helyesek, és a céladatbázisra irányuló extra oda-vissza érvényesítési hívás biztonságosan kihagyható. Ez csökkenti az adatbázis-forgalmat. A connectionOptions egy konfigurációs fájlban lévő értéken keresztül is beállítható, hogy jelezze, hogy várhatók-e horizontális változások egy adott időszakban.

Ez a példa egy CustomerID egész szám kulcs értékét használja egy customerShardMap nevű ShardMap-objektummal.

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

Az Open Csatlakozás ionForKey metódus egy új, már megnyitott kapcsolatot ad vissza a megfelelő adatbázishoz. az ily módon használt Csatlakozás továbbra is teljes mértékben kihasználják a kapcsolatkészletezés előnyeit.

Az Open Csatlakozás ionForKeyAsync metódus (Java, .NET) akkor is elérhető, ha az alkalmazás aszinkron programozást használ.

Integráció átmeneti hibakezeléssel

A felhőbeli adatelérési alkalmazások fejlesztésének egyik ajánlott eljárása annak biztosítása, hogy az alkalmazás átmeneti hibákat észleljen, és hogy a műveletek többször is újrapróbálkozzanak, mielőtt hibát okoznak. A felhőalkalmazások átmeneti hibakezelését az Átmeneti hibakezelés (Java, .NET) című témakörben tárgyaljuk.

Az átmeneti hibakezelés természetesen együtt tud létezni az adatfüggő útválasztási mintával. A legfontosabb követelmény a teljes adatelérési kérelem újrapróbálkozása, beleértve az adatfüggő útválasztási kapcsolatot lekért blokkot is. Az előző példa a következőképpen írható át.

Példa – adatfüggő útválasztás átmeneti hibakezeléssel

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

Az átmeneti hibakezelés végrehajtásához szükséges csomagok automatikusan letöltődnek a rugalmas adatbázis-mintaalkalmazás létrehozásakor.

Tranzakciós konzisztencia

A tranzakciós tulajdonságok minden helyi művelet esetében garantáltak egy szegmensben. Az adatfüggő útválasztással elküldött tranzakciók például a kapcsolat cél szegmensének hatókörén belül futnak. Jelenleg nincsenek olyan képességek, amelyek lehetővé teszik, hogy több kapcsolatot csatoljon egy tranzakcióhoz, ezért nincsenek tranzakciós garanciák a szegmensek között végrehajtott műveletekre.

További lépések

A szegmens leválasztásához vagy egy szegmens újracsatolásához lásd : A RecoveryManager osztály használata a szegmenstérképekkel kapcsolatos problémák megoldásához.

További információforrások

Még nem használ rugalmas adatbázis-eszközöket? Tekintse meg az első lépések útmutatót. Ha kérdése van, lépjen kapcsolatba velünk az SQL Database-hez készült Microsoft Q&A kérdésoldalon, és a funkciókérésekért, adjon hozzá új ötleteket, vagy szavazzon a meglévő ötletekre az SQL Database visszajelzési fórumában.