Sdílet prostřednictvím


Použití klientské knihovny elastické databáze s Dapperem

Platí pro: Azure SQL Database

Tento dokument je určený pro vývojáře, kteří při sestavování aplikací spoléhají na Dapper, ale chtějí využít také nástroje elastické databáze k vytváření aplikací, které implementují horizontální dělení, aby horizontálně navyšovaly kapacitu datové vrstvy. Tento dokument ukazuje změny v aplikacích založených na Dapperu, které jsou nezbytné k integraci s nástroji elastické databáze. Zaměřujeme se na vytváření správy horizontálních oddílů elastické databáze a směrování závislého na datech pomocí Dapperu.

Ukázkový kód: Nástroje elastické databáze pro Azure SQL Database – Integrace Dapperu

Integrace Dapperu a DapperExtensions s klientskou knihovnou elastické databáze pro Azure SQL Database je snadná. Aplikace můžou používat směrování závislé na datech změnou vytvoření a otevření nových objektů SqlConnection tak, aby používaly volání OpenConnectionForKey z klientské knihovny. Tím se změny v aplikaci omezí jenom na to, kde se vytvořená a otevřená nová připojení.

Přehled dapperu

Dapper je objektově-relační mapovač. Mapuje objekty .NET z vaší aplikace na relační databázi (a naopak). První část ukázkového kódu ukazuje, jak můžete integrovat klientskou knihovnu elastické databáze s aplikacemi založenými na Dapperu. Druhá část ukázkového kódu ukazuje, jak integrovat při použití Dapperu i DapperExtensions.

Funkce mapperu v Dapperu poskytuje rozšiřující metody u databázových připojení, která zjednodušují odesílání příkazů T-SQL pro provádění nebo dotazování databáze. Dapper například usnadňuje mapování mezi vašimi objekty .NET a parametry příkazů SQL pro volání execute nebo využívat výsledky dotazů SQL do objektů .NET pomocí volání dotazů z Dapperu.

Při použití dapperExtensions už nemusíte zadávat příkazy SQL. Metody rozšíření, jako je GetList nebo Insert , přes připojení k databázi vytvářejí příkazy SQL na pozadí.

Další výhodou dapperu a také DapperExtensions je, že aplikace řídí vytváření připojení k databázi. To pomáhá pracovat s klientskou knihovnou elastické databáze, která zprostředkovává připojení databáze na základě mapování shardletů na databáze.

Pokud chcete získat sestavení Dapperu, přečtěte si téma Dapper dot net. Rozšíření Dapperu najdete v tématu DapperExtensions.

Rychlý přehled klientské knihovny elastické databáze

Pomocí klientské knihovny elastické databáze definujete oddíly vašich aplikačních dat označovaných jako shardlety, mapujete je na databáze a identifikujete je pomocí klíčů horizontálního dělení. Můžete mít tolik databází, kolik potřebujete, a distribuovat shardlety napříč těmito databázemi. Mapování hodnot klíče horizontálního dělení na databáze je uloženo mapou horizontálních oddílů, kterou poskytuje rozhraní API knihovny. Tato funkce se nazývá správa mapování horizontálních oddílů. Mapa horizontálních oddílů slouží také jako zprostředkovatel připojení databáze pro požadavky, které mají klíč horizontálního dělení. Tato funkce se označuje jako směrování závislé na datech.

Mapy horizontálních oddílů a směrování závislé na datech

Správce mapování horizontálních oddílů chrání uživatele před nekonzistentními zobrazeními do dat shardletu, ke kterým může dojít při souběžných operacích správy horizontálních oddílů v databázích. K tomu mapování horizontálních oddílů zprostředkuje připojení databáze pro aplikaci vytvořenou s knihovnou. Když operace správy horizontálních oddílů můžou mít vliv na shardlet, umožní to funkci mapování horizontálních oddílů automaticky zabíjet připojení k databázi.

Místo použití tradičního způsobu vytváření připojení pro Dapper musíte použít OpenConnectionForKey metoda. Tím se zajistí, že proběhne veškeré ověření a připojení se budou spravovat správně, když se všechna data přesunou mezi horizontálními oddíly.

Požadavky na integraci Dapperu

Při práci s klientskou knihovnou elastické databáze i rozhraními DAPPER API chcete zachovat následující vlastnosti:

  • Horizontální navýšení kapacity: Podle potřeby chceme přidat nebo odebrat databáze z datové vrstvy horizontálně dělené aplikace pro požadavky aplikace na kapacitu.
  • Konzistence: Vzhledem k tomu, že se aplikace škáluje pomocí horizontálního dělení, je potřeba provést směrování závislé na datech. Chceme k tomu použít možnosti směrování závislé na datech knihovny. Konkrétně chcete zachovat záruky ověřování a konzistence poskytované připojeními zprostředkovanými prostřednictvím správce mapování horizontálních oddílů, aby se zabránilo poškození nebo nesprávnému výsledku dotazu. Tím se zajistí, že se připojení k danému shardletu zamítnou nebo zastaví, pokud se (například) shardlet přesune do jiného horizontálního oddílu pomocí rozhraní API rozdělení nebo sloučení.
  • Mapování objektů: Chceme zachovat pohodlí mapování poskytovaných Dapperem pro překlad mezi třídami v aplikaci a podkladovými strukturami databáze.

Následující část obsahuje pokyny pro tyto požadavky pro aplikace založené na Dapperu a DapperExtensions.

Technické pokyny

Směrování závislé na datech pomocí Dapperu

S Dapperem je aplikace obvykle zodpovědná za vytváření a otevírání připojení k podkladové databázi. Dapper vrátí výsledky dotazu jako kolekce .NET typu T. Dapper provede mapování z řádků výsledků T-SQL na objekty typu T. Dapper provede mapování z řádků výsledků T-SQL na objekty typu T. Podobně Dapper mapuje objekty .NET na hodnoty SQL nebo parametry pro příkazy jazyka DML (Data Manipulat Language). Dapper nabízí tuto funkci prostřednictvím rozšiřujících metod u běžného objektu SqlConnection z klientských knihoven ADO .NET SQL. Připojení SQL vrácené rozhraními API elastického škálování pro DDR jsou také běžné objekty SqlConnection . To nám umožňuje přímo používat rozšíření Dapperu nad typem vráceným rozhraním DDR API klientské knihovny, protože se jedná také o jednoduché připojení klienta SQL.

Tato pozorování usnadňují použití připojení zprostředkovaných klientskou knihovnou elastické databáze pro Dapper.

Tento příklad kódu (z doprovodné ukázky) znázorňuje přístup, při kterém je klíč horizontálního dělení poskytnut aplikací knihovně pro zprostředkování připojení ke správnému horizontálnímu oddílu.

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

Volání rozhraní OpenConnectionForKey API nahrazuje výchozí vytvoření a otevření připojení klienta SQL. Volání OpenConnectionForKey přebírá argumenty požadované pro směrování závislé na datech:

  • Mapování horizontálních oddílů pro přístup k rozhraním směrování závislým na datech
  • Klíč horizontálního dělení pro identifikaci shardletu
  • Přihlašovací údaje (uživatelské jméno a heslo) pro připojení k horizontálnímu oddílu

Objekt mapování horizontálních oddílů vytvoří připojení k horizontálnímu oddílu, který obsahuje shardlet pro daný klíč horizontálního dělení. Klientská rozhraní API elastické databáze také označí připojení, aby implementovala záruky konzistence. Vzhledem k tomu, že volání OpenConnectionForKey vrací běžný objekt připojení klienta SQL, následné volání Metody Execute rozšíření z Dapperu se řídí standardním postupem Dapperu.

Dotazy fungují velmi stejně – nejprve otevřete připojení pomocí OpenConnectionForKey z klientského rozhraní API. Pak pomocí běžných rozšiřujících metod Dapperu namapujete výsledky dotazu SQL na objekty .NET:

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

Všimněte si, že použití bloku s obory připojení DDR všechny databázové operace v rámci bloku na jeden horizontální oddíl, ve kterém je tenantId1 zachován. Dotaz vrátí pouze blogy uložené v aktuálním horizontálním oddílu, ale ne ty, které jsou uložené v jiných horizontálních oddílech.

Směrování závislé na datech pomocí Dapperu a DapperExtensions

Dapper je součástí ekosystému dalších rozšíření, která mohou při vývoji databázových aplikací poskytovat další pohodlí a abstrakci z databáze. Příkladem je DapperExtensions.

Použití dapperExtensions ve vaší aplikaci nemění způsob vytváření a spravování připojení databáze. Aplikace je stále zodpovědná za otevření připojení a běžné objekty připojení klienta SQL se očekávají metodami rozšíření. Můžeme spoléhat na OpenConnectionForKey , jak je uvedeno výše. Jak ukazuje následující ukázky kódu, jedinou změnou je, že už nemusíte psát příkazy T-SQL:

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

A tady je ukázka kódu pro dotaz:

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

Zpracování přechodných chyb

Tým Microsoft Patterns &Practices publikoval blok aplikace pro zpracování přechodných chyb, který vývojářům aplikací pomáhá zmírnit běžné přechodné chybové stavy, ke kterým došlo při spuštění v cloudu. Další informace naleznete v tématu Vytrvalost, tajemství všech vítězství: Použití přechodného bloku aplikace pro zpracování chyb.

Ukázka kódu spoléhá na přechodnou knihovnu chyb k ochraně před přechodnými chybami.

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

SqlDatabaseUtils.SqlRetryPolicy v kódu výše je definován jako SqlDatabaseTransientErrorDetectionStrategy s počtem opakování 10 a 5 sekund čekání mezi opakováními. Pokud používáte transakce, ujistěte se, že se rozsah opakování vrátí zpět na začátek transakce v případě přechodné chyby.

Omezení

Přístupy popsané v tomto dokumentu zahrnují několik omezení:

  • Ukázkový kód pro tento dokument neukazuje, jak spravovat schéma napříč horizontálními oddíly.
  • Vzhledem k požadavku předpokládáme, že veškeré zpracování databáze je obsaženo v jednom horizontálním oddílu, jak je identifikováno klíčem horizontálního dělení poskytnutého požadavkem. Tento předpoklad ale nemusí vždy obsahovat, například pokud není možné zpřístupnit klíč horizontálního dělení. Pro vyřešení toho klientská knihovna elastické databáze obsahuje třídu MultiShardQuery. Třída implementuje abstrakci připojení pro dotazování na několik horizontálních oddílů. Použití MultiShardQuery v kombinaci s Dapperem je nad rámec tohoto dokumentu.

Závěr

Aplikace využívající Dapper a DapperExtensions můžou snadno těžit z nástrojů elastické databáze pro Azure SQL Database. Prostřednictvím kroků popsaných v tomto dokumentu můžou tyto aplikace používat funkci nástroje pro směrování závislé na datech změnou vytvoření a otevření nových objektů SqlConnection tak, aby používaly volání OpenConnectionForKey klientské knihovny elastické databáze. Tím se omezí změny aplikace potřebné na těch místech, kde se vytvářejí a otevírají nová připojení.

Ještě nepoužíváte nástroje elastické databáze? Podívejte se na naši příručku Začínáme. Pokud máte dotazy, kontaktujte nás na stránce otázek Microsoft Q&A pro SLUŽBU SQL Database a žádosti o funkce, přidejte nové nápady nebo hlasujte pro stávající nápady ve fóru pro zpětnou vazbu ke službě SQL Database.