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:
- A kódtár Java-verziója, lásd a Maven Central-adattárat.
- A kódtár .NET-verziója, lásd : NuGet.
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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: