Share via


Rugalmas adatbázis-ügyfélkódtár használata a Dapperrel

A következőre vonatkozik: Azure SQL Database

Ez a dokumentum olyan fejlesztők számára készült, amelyek a Dapperre támaszkodnak az alkalmazások létrehozásához, de rugalmas adatbázis-eszközöket is szeretnének használni az adatréteg horizontális felskálázásához horizontális horizontális felskálázást megvalósító alkalmazások létrehozásához. Ez a dokumentum bemutatja a Dapper-alapú alkalmazások azon változásait, amelyek a rugalmas adatbázis-eszközökkel való integrációhoz szükségesek. A célunk a rugalmas adatbázis-szegmenskezelés és az adatfüggő útválasztás összeállítása a Dapperrel.

Mintakód: Rugalmas adatbázis-eszközök az Azure SQL Database-hez – Dapper-integráció.

A Dapper és a DapperExtensions könnyen integrálható az Azure SQL Database rugalmas adatbázis-ügyfélkódtárával. Az alkalmazások adatfüggő útválasztást használhatnak, ha módosítják az új Sql Csatlakozás ion-objektumok létrehozását és megnyitását, hogy az ügyféltárból érkező Open Csatlakozás ionForKey hívást használják. Ez az alkalmazás módosításait csak az új kapcsolatok létrehozására és megnyitására korlátozza.

A Dapper áttekintése

A Dapper egy objektum-relációs mapper. .NET-objektumokat képez le az alkalmazásból egy relációs adatbázisba (és fordítva). A mintakód első része bemutatja, hogyan integrálható a rugalmas adatbázis-ügyfélkódtár a Dapper-alapú alkalmazásokkal. A mintakód második része bemutatja, hogyan integrálható a Dapper és a DapperExtensions használatakor.

A Dapper leképező funkciója bővítménymetelyeket biztosít az adatbázis-kapcsolatokhoz, amelyek leegyszerűsítik a T-SQL-utasítások küldését az adatbázis végrehajtásához vagy lekérdezéséhez. A Dapper például megkönnyíti a .NET-objektumok és az SQL-utasítások paraméterei közötti leképezést a hívások végrehajtásához, vagy az SQL-lekérdezések eredményeit .NET-objektumokba használja a Dapper lekérdezéshívásaival.

A DapperExtensions használatakor már nem kell megadnia az SQL-utasításokat. Az olyan bővítmények, mint a GetList vagy a Beszúrás az adatbázis-kapcsolaton keresztül, a színfalak mögött hozzák létre az SQL-utasításokat.

A Dapper és a DapperExtensions másik előnye, hogy az alkalmazás szabályozza az adatbázis-kapcsolat létrehozását. Ez segít kezelni a rugalmas adatbázis-ügyfélkódtárat, amely a szegmensek adatbázisokhoz való leképezése alapján közvetíti az adatbázis-kapcsolatokat.

A Dapper szerelvények beszerzéséhez lásd a Dapper ponthálót. A Dapper-bővítményekért lásd : DapperExtensions.

A rugalmas adatbázis ügyfélkódtárának gyors pillantása

A rugalmas adatbázis-ügyfélkódtár segítségével definiálhatja az alkalmazásadatok partícióit shardletek néven, leképezheti őket adatbázisokhoz, és skálázási kulcsokkal azonosíthatja őket. Annyi adatbázissal rendelkezhet, amennyit csak szeretne, és eloszthatja a szegmenseket ezeken az adatbázisokon. A skálázási kulcsértékek adatbázisokhoz való leképezését a kódtár API-k által biztosított szegmenstérkép tárolja. Ezt a képességet szegmenstérkép-kezelésnek nevezzük. A szegmenstérkép adatbázis-kapcsolatok közvetítőjeként is szolgál a szilánkkulcsot tartalmazó kérések esetében. Ezt a képességet adatfüggő útválasztásnak nevezzük.

Shard maps and data-dependent routing

A szegmenstérkép-kezelő megvédi a felhasználókat az inkonzisztens nézetektől olyan szegmensadatokká, amelyek akkor fordulhatnak elő, ha egyidejű shardletkezelési műveletek történnek az adatbázisokon. Ehhez a szegmens leképezi a kódtárral létrehozott alkalmazás adatbázis-kapcsolatait. Ha a szegmenskezelési műveletek hatással lehetnek a szegmensekre, ez lehetővé teszi, hogy a szegmensleképezési funkció automatikusan megöljön egy adatbázis-kapcsolatot.

AHelyett, hogy hagyományos módon hoz létre kapcsolatokat a Dapperhez, az Open Csatlakozás ionForKey metódust kell használnia. Ez biztosítja, hogy az összes ellenőrzés lezajljon, és a kapcsolatok megfelelően legyenek kezelve, amikor az adatok a szegmensek között mozognak.

A Dapper-integráció követelményei

A rugalmas adatbázis-ügyfélkódtár és a Dapper API-k használatakor a következő tulajdonságokat kell megőriznie:

  • Horizontális felskálázás: Az alkalmazás kapacitásigényéhez szükséges módon szeretnénk adatbázisokat hozzáadni vagy eltávolítani a horizontálisan tagolt alkalmazás adatrétegéből.
  • Konzisztencia: Mivel az alkalmazást horizontális felskálázással skálázták fel, adatfüggő útválasztást kell végrehajtania. Ehhez a kódtár adatfüggő útválasztási képességeit szeretnénk használni. Különösen a szegmenstérkép-kezelőn keresztül közvetített kapcsolatok által biztosított érvényesítési és konzisztencia-garanciákat szeretné megőrizni, hogy elkerülje a sérülést vagy a helytelen lekérdezési eredményeket. Ez biztosítja, hogy a rendszer elutasítsa vagy leállítja egy adott szegmens kapcsolatait, ha (például) a szegmens jelenleg egy másik szegmensbe van áthelyezve felosztási/egyesítési API-k használatával.
  • Objektumleképezés: Meg szeretnénk őrizni a Dapper által biztosított leképezések kényelmét az alkalmazás osztályai és az alapul szolgáló adatbázis-struktúrák közötti fordításhoz.

Az alábbi szakasz útmutatást nyújt a Dapper és a DapperExtensions alapú alkalmazásokra vonatkozó követelményekhez.

Technikai útmutató

Adatfüggő útválasztás a Dapperrel

A Dapper esetében az alkalmazás általában a mögöttes adatbázis kapcsolatainak létrehozásáért és megnyitásáért felelős. Ha az alkalmazás T típusú, a Dapper t típusú .NET-gyűjteményként adja vissza a lekérdezési eredményeket. A Dapper elvégzi a T-SQL eredménysorok és a T típusú objektumok leképezését. Hasonlóképpen, a Dapper a .NET-objektumokat SQL-értékekké vagy paraméterekké alakítja az adatmanipulációs nyelv (DML) utasításaihoz. A Dapper ezt a funkciót az ADO .NET SQL-ügyfélkódtárakból származó szokásos Sql Csatlakozás ion-objektum bővítménymetódusán keresztül kínálja. A DDR rugalmas méretezési API-k által visszaadott SQL-kapcsolat szintén rendszeres SQL Csatlakozás ion-objektumok. Ez lehetővé teszi a Dapper-bővítmények közvetlen használatát az ügyfélkódtár DDR API-ja által visszaadott típuson keresztül, mivel ez egy egyszerű SQL-ügyfélkapcsolat is.

Ezek a megfigyelések megkönnyítik a Rugalmas adatbázis ügyfélkódtára által közvetített kapcsolatok használatát a Dapper számára.

Ez a kódminta (a mellékelt mintából) azt a megközelítést mutatja be, ahol az alkalmazás a szilánkkulcsot a tárhoz irányítja a jobb oldali szegmenshez való kapcsolat közvetítéséhez.

    using (SqlConnection sqlconn = shardingLayer.ShardMap.OpenConnectionForKey(
                     key: tenantId1,
                     connectionString: connStrBldr.ConnectionString,
                     options: ConnectionOptions.Validate))
    {
        var blog = new Blog { Name = name };
        sqlconn.Execute(@"
                      INSERT INTO
                            Blog (Name)
                            VALUES (@name)", new { name = blog.Name }
                        );
    }

Az Open Csatlakozás ionForKey API hívása felülírja az SQL-ügyfélkapcsolat alapértelmezett létrehozását és megnyitását. A Megnyitás Csatlakozás ionForKey hívás az adatfüggő útválasztáshoz szükséges argumentumokat veszi fel:

  • A szegmenstérkép az adatfüggő útválasztási felületek eléréséhez
  • A szegmenskulcs a szegmens azonosításához
  • A szegmenshez való csatlakozáshoz szükséges hitelesítő adatok (felhasználónév és jelszó)

A szegmensleképezési objektum kapcsolatot hoz létre a szegmenshez, amely az adott szegmenskulcshoz tartozó szegmenst tartalmazza. A rugalmas adatbázis-ügyfél API-k a konzisztencia garanciáinak megvalósításához is címkézik a kapcsolatot. Mivel az Open Csatlakozás ionForKey hívása egy normál SQL-ügyfélkapcsolati objektumot ad vissza, a Dapper végrehajtási bővítmény metódusának következő hívása a szokásos Dapper-gyakorlatot követi.

A lekérdezések ugyanúgy működnek – először az Open Csatlakozás ionForKey használatával nyitja meg a kapcsolatot az ügyfél API-ból. Ezután a szokásos Dapper-bővítménymetódusokkal leképzi az SQL-lekérdezés eredményeit .NET-objektumokra:

    using (SqlConnection sqlconn = shardingLayer.ShardMap.OpenConnectionForKey(
                    key: tenantId1,
                    connectionString: connStrBldr.ConnectionString,
                    options: ConnectionOptions.Validate ))
    {
           // Display all Blogs for tenant 1
           IEnumerable<Blog> result = sqlconn.Query<Blog>(@"
                                SELECT *
                                FROM Blog
                                ORDER BY Name");

           Console.WriteLine("All blogs for tenant id {0}:", tenantId1);
           foreach (var item in result)
           {
                Console.WriteLine(item.Name);
            }
    }

Vegye figyelembe, hogy a DDR-kapcsolattal rendelkező használatblokk a blokkon belüli összes adatbázis-műveletet arra a szegmensre terjed ki, ahol a tenantId1 található. A lekérdezés csak az aktuális szegmensben tárolt blogokat adja vissza, más szegmenseken tároltakat azonban nem.

Adatfüggő útválasztás a Dapper és a DapperExtensions használatával

A Dapper egy további bővítményekkel rendelkező ökoszisztémával rendelkezik, amely további kényelmet és absztrakciót biztosít az adatbázisból az adatbázis-alkalmazások fejlesztésekor. A DapperExtensions egy példa.

A DapperExtensions használata az alkalmazásban nem változtatja meg az adatbázis-kapcsolatok létrehozásának és kezelésének módját. Továbbra is az alkalmazás feladata a kapcsolatok megnyitása, és a bővítménymetódusok normál SQL-ügyfélkapcsolati objektumokat várnak. A fent vázolt Open Csatlakozás ionForKey fájlra támaszkodhatunk. Ahogy az alábbi kódminták is mutatják, az egyetlen változás az, hogy már nem kell megírnia a T-SQL-utasításokat:

    using (SqlConnection sqlconn = shardingLayer.ShardMap.OpenConnectionForKey(
                    key: tenantId2,
                    connectionString: connStrBldr.ConnectionString,
                    options: ConnectionOptions.Validate))
    {
           var blog = new Blog { Name = name2 };
           sqlconn.Insert(blog);
    }

A lekérdezés kódmintája pedig a következő:

    using (SqlConnection sqlconn = shardingLayer.ShardMap.OpenConnectionForKey(
                    key: tenantId2,
                    connectionString: connStrBldr.ConnectionString,
                    options: ConnectionOptions.Validate))
    {
           // Display all Blogs for tenant 2
           IEnumerable<Blog> result = sqlconn.GetList<Blog>();
           Console.WriteLine("All blogs for tenant id {0}:", tenantId2);
           foreach (var item in result)
           {
               Console.WriteLine(item.Name);
           }
    }

Átmeneti hibák kezelése

A Microsoft Patterns & Practices csapata közzétette az átmeneti hibakezelési alkalmazásblokkot , amely segít az alkalmazásfejlesztőknek enyhíteni a felhőben való futtatáskor előforduló gyakori átmeneti hibafeltételeket. További információ: Kitartás, Minden diadal titka: Az átmeneti hibakezelési alkalmazásblokk használata.

A kódminta az átmeneti hibatárra támaszkodik az átmeneti hibák elleni védelem érdekében.

    SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() =>
    {
       using (SqlConnection sqlconn =
          shardingLayer.ShardMap.OpenConnectionForKey(tenantId2, connStrBldr.ConnectionString, ConnectionOptions.Validate))
          {
              var blog = new Blog { Name = name2 };
              sqlconn.Insert(blog);
          }
    });

Az SqlDatabaseUtils.SqlRetryPolicy a fenti kódban sqlDatabaseTransientErrorDetectionStrategy néven van definiálva, amelynek újrapróbálkozási száma 10, és 5 másodperc várakozási idő az újrapróbálkozások között. Ha tranzakciókat használ, győződjön meg arról, hogy az újrapróbálkozási hatókör egy átmeneti hiba esetén visszamegy a tranzakció elejére.

Korlátozások

A dokumentumban ismertetett megközelítések néhány korlátozást vonnak maguk után:

  • A dokumentum mintakódja nem mutatja be a sémák szegmensek közötti kezelését.
  • Egy kérés alapján feltételezzük, hogy az adatbázis-feldolgozás egyetlen szegmensben található, a kérés által biztosított skálázási kulcs alapján. Ez a feltételezés azonban nem mindig rendelkezik például akkor, ha nem lehet elérhetővé tenni egy szegmenskulcsot. Ennek megoldásához a rugalmas adatbázis-ügyfélkódtár tartalmazza a MultiShardQuery osztályt. Az osztály kapcsolati absztrakciót valósít meg több szegmensen keresztüli lekérdezéshez. A MultiShardQuery és a Dapper együttes használata meghaladja a dokumentum hatókörét.

Összefoglalás

A Dappert és a DapperExtensionst használó alkalmazások könnyen kihasználhatják az Azure SQL Database rugalmas adatbázis-eszközeinek előnyeit. A dokumentumban ismertetett lépések révén ezek az alkalmazások az eszköz adatfüggő útválasztási képességét használhatják az új Sql Csatlakozás ion-objektumok létrehozásának és megnyitásának módosításával a rugalmas adatbázis-ügyféltár Open Csatlakozás ionForKey hívásának használatára. Ez korlátozza a szükséges alkalmazásmódosításokat azokon a helyeken, ahol új kapcsolatok jönnek létre és nyílnak meg.

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.