Dapper ile elastik veritabanı istemci kitaplığını kullanma

Şunlar için geçerlidir:Azure SQL Veritabanı

Bu belge, Uygulama oluşturmak için Dapper'a güvenen ancak veri katmanlarını genişletmek için parçalama uygulayan uygulamalar oluşturmak için elastik veritabanı araçlarını benimsemek isteyen geliştiricilere yöneliktir. Bu belgede, elastik veritabanı araçlarıyla tümleştirmek için gereken Dapper tabanlı uygulamalarda yapılan değişiklikler gösterilmektedir. Dapper ile elastik veritabanı parça yönetimini ve verilere bağımlı yönlendirmeyi oluşturma konusuna odaklanalım.

Örnek Kod: Azure SQL Veritabanı için elastik veritabanı araçları - Dapper tümleştirmesi.

Dapper ve DapperExtensions'ı Azure SQL Veritabanı için elastik veritabanı istemci kitaplığıyla tümleştirmek kolaydır. Uygulamalarınız, istemci kitaplığından Open Bağlan ionForKey çağrısını kullanmak için yeni Sql Bağlan ion nesnelerinin oluşturulmasını ve açılmasını değiştirerek verilere bağımlı yönlendirmeyi kullanabilir. Bu, uygulamanızdaki değişiklikleri yalnızca yeni bağlantıların oluşturulduğu ve açıldığı yerle sınırlar.

Dapper'a genel bakış

Dapper , nesne-ilişkisel eşleyicidir. Uygulamanızdaki .NET nesnelerini ilişkisel bir veritabanına eşler (ve tam tersi). Örnek kodun ilk bölümünde, elastik veritabanı istemci kitaplığını Dapper tabanlı uygulamalarla nasıl tümleştirebileceğiniz gösterilmektedir. Örnek kodun ikinci bölümünde hem Dapper hem de DapperExtensions kullanılırken tümleştirme gösterilmektedir.

Dapper'daki eşleyici işlevi, veritabanı bağlantıları üzerinde yürütme veya sorgu için T-SQL deyimlerini göndermeyi basitleştiren uzantı yöntemleri sağlar. Örneğin Dapper, .NET nesnelerinizle Execute çağrıları için SQL deyimlerinin parametreleri arasında eşlemeyi veya Dapper'dan gelen Sorgu çağrılarını kullanarak SQL sorgularınızın sonuçlarını .NET nesnelerine kullanmayı kolaylaştırır.

DapperExtensions kullanırken artık SQL deyimlerini sağlamanız gerekmez. Veritabanı bağlantısı üzerinden GetList veya Insert gibi uzantı yöntemleri arka planda SQL deyimlerini oluşturur.

Dapper ve da DapperExtensions'ın bir diğer avantajı, uygulamanın veritabanı bağlantısının oluşturulmasını denetlemesidir. Bu, parçacıklar ile veritabanları arasındaki eşlemeye göre veritabanı bağlantılarını aracılık eden elastik veritabanı istemci kitaplığıyla etkileşime yardımcı olur.

Dapper derlemelerini almak için bkz . Dapper dot net. Dapper uzantıları için bkz . DapperExtensions.

Elastik veritabanı istemci kitaplığına hızlı bakış

Elastik veritabanı istemci kitaplığıyla, uygulama verilerinizin parçacıklar adlı bölümlerini tanımlar, veritabanlarına eşler ve bunları parçalama anahtarlarıyla tanımlarsınız. İstediğiniz kadar veritabanınız olabilir ve parçalarınızı bu veritabanları arasında dağıtabilirsiniz. Parçalama anahtarı değerlerinin veritabanlarına eşlenmesi, kitaplığın API'leri tarafından sağlanan bir parça eşlemesi tarafından depolanır. Bu özellik parça eşleme yönetimi olarak adlandırılır. Parça eşlemesi, parçalama anahtarı taşıyan istekler için veritabanı bağlantılarının aracısı olarak da görev alır. Bu özellik, verilere bağımlı yönlendirme olarak adlandırılır.

Shard maps and data-dependent routing

Parça eşleme yöneticisi, kullanıcıları veritabanlarında eşzamanlı parçacık yönetimi işlemleri gerçekleştiğinde gerçekleşebilecek tutarsız görünümlerden parçacık verilerine karşı korur. Bunu yapmak için parça eşlemeleri, kitaplıkla oluşturulmuş bir uygulamanın veritabanı bağlantılarını aracılar. Parça yönetimi işlemleri parçalıyı etkileyebilse de, bu, parça eşleme işlevinin veritabanı bağlantısını otomatik olarak sonlandırmasına olanak tanır.

Dapper için geleneksel bağlantı oluşturma yöntemini kullanmak yerine Open Bağlan ionForKey yöntemini kullanmanız gerekir. Bu, tüm doğrulamaların gerçekleştirilmesini ve veriler parçalar arasında hareket ettiğinde bağlantıların düzgün yönetilmesini sağlar.

Dapper tümleştirme gereksinimleri

Hem elastik veritabanı istemci kitaplığı hem de Dapper API'leriyle çalışırken aşağıdaki özellikleri korumak istiyorsunuz:

  • Ölçeği genişletme: Uygulamanın kapasite talepleri için gereken şekilde parçalanmış uygulamanın veri katmanına veritabanı eklemek veya kaldırmak istiyoruz.
  • Tutarlılık: Uygulamanın ölçeği parçalama kullanılarak genişletildiğinden, verilere bağlı yönlendirme gerçekleştirmeniz gerekir. Bunu yapmak için kitaplığın verilere bağımlı yönlendirme özelliklerini kullanmak istiyoruz. Özellikle, bozulmayı veya yanlış sorgu sonuçlarını önlemek için parça eşleme yöneticisi aracılığıyla aracılık edilen bağlantılar tarafından sağlanan doğrulama ve tutarlılık garantilerini korumak istiyorsunuz. Bu, belirli bir parçacıkla bağlantıların reddedilmesini veya parçalı parçanın (örneğin) Bölme/Birleştirme API'leri kullanılarak farklı bir parçaya taşınması durumunda durdurulmasını sağlar.
  • Nesne Eşlemesi: Uygulamadaki sınıflar ile temel alınan veritabanı yapıları arasında çeviri yapmak için Dapper tarafından sağlanan eşlemelerin rahatlığını korumak istiyoruz.

Aşağıdaki bölümde, Dapper ve DapperExtensions tabanlı uygulamalar için bu gereksinimlere yönelik yönergeler sağlanmaktadır.

Teknik rehberlik

Dapper ile verilere bağımlı yönlendirme

Dapper ile uygulama genellikle temel alınan veritabanının bağlantılarını oluşturmak ve açmakla sorumludur. Uygulama tarafından T türü verilip, Dapper sorgu sonuçlarını T türünde .NET koleksiyonları olarak döndürür. Dapper, T-SQL sonuç satırlarından T türündeki nesnelere eşlemeyi gerçekleştirir. Benzer şekilde, Dapper veri işleme dili (DML) deyimleri için .NET nesnelerini SQL değerlerine veya parametrelerine eşler. Dapper bu işlevi ADO .NET SQL İstemci kitaplıklarından normal Sql Bağlan ion nesnesinde uzantı yöntemleri aracılığıyla sunar. DDR için Elastik Ölçek API'leri tarafından döndürülen SQL bağlantısı da normal Sql Bağlan ion nesneleridir. Bu da basit bir SQL İstemci bağlantısı olduğu için istemci kitaplığının DDR API'sinin döndürdiği tür üzerinde Dapper uzantılarını doğrudan kullanmamızı sağlar.

Bu gözlemler, Dapper için elastik veritabanı istemci kitaplığı tarafından aracılı bağlantıların kullanılmasını kolaylaştırır.

Bu kod örneği (eşlik eden örnekten), doğru parçaya bağlantı aracılık etmek için parçalama anahtarının uygulama tarafından kitaplığa sağlandığı yaklaşımı gösterir.

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

Open Bağlan ionForKey API'sine yapılan çağrı, SQL İstemcisi bağlantısının varsayılan oluşturma ve açma işleminin yerini alır. Open Bağlan ionForKey çağrısı, verilere bağımlı yönlendirme için gereken bağımsız değişkenleri alır:

  • Verilere bağımlı yönlendirme arabirimlerine erişmek için parça eşlemesi
  • Parçalama anahtarını tanımlama
  • Parçaya bağlanacak kimlik bilgileri (kullanıcı adı ve parola)

Parça eşleme nesnesi, verilen parçalama anahtarının parçacıklarını tutan parçaya bir bağlantı oluşturur. Elastik veritabanı istemci API'leri, tutarlılık garantilerini uygulamak için bağlantıyı da etiketler. Open Bağlan ionForKey çağrısı normal bir SQL İstemcisi bağlantı nesnesi döndürdüğünden, Dapper'dan yürütme uzantısı yöntemineyapılan sonraki çağrı standart Dapper uygulamasını izler.

Sorgular aynı şekilde çalışır; önce istemci API'sinden Open Bağlan ionForKey kullanarak bağlantıyı açarsınız. Ardından, SQL sorgunuzun sonuçlarını .NET nesnelerine eşlemek için normal Dapper uzantısı yöntemlerini kullanırsınız:

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

DDR bağlantısına sahip using bloğunun, blok içindeki tüm veritabanı işlemlerini tenantId1'in tutulduğu tek parçaya kapsamlar. Sorgu yalnızca geçerli parçada depolanan blogları döndürür, ancak diğer parçalarda depolanan blogları döndürmez.

Dapper ve DapperExtensions ile verilere bağımlı yönlendirme

Dapper, veritabanı uygulamaları geliştirirken veritabanından daha fazla kolaylık ve soyutlama sağlayabilen ek uzantılardan oluşan bir ekosistemle birlikte gelir. DapperExtensions bir örnektir.

Uygulamanızda DapperExtensions kullanılması, veritabanı bağlantılarının oluşturulma ve yönetilme şeklini değiştirmez. Bağlantıları açmak hala uygulamanın sorumluluğundadır ve uzantı yöntemleri tarafından normal SQL İstemcisi bağlantı nesneleri beklenir. Yukarıda açıklandığı gibi Open Bağlan ionForKey kullanabiliriz. Aşağıdaki kod örneklerinde gösterildiği gibi, tek değişiklik artık T-SQL deyimlerini yazmak zorunda kalmamaktır:

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

Sorgunun kod örneği aşağıda verilmiştir:

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

Geçici hataları işleme

Microsoft Desenleri ve Uygulamaları ekibi, uygulama geliştiricilerinin bulutta çalışırken karşılaşılan yaygın geçici hata koşullarını azaltmasına yardımcı olmak için Geçici Hata İşleme Uygulama Bloğunu yayımladı. Daha fazla bilgi için bkz . Sebat, Tüm Zaferlerin Sırrı: Geçici Hata İşleme Uygulama Bloğunu Kullanma.

Kod örneği, geçici hatalara karşı koruma sağlamak için geçici hata kitaplığına dayanır.

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

Yukarıdaki koddaki SqlDatabaseUtils.SqlRetryPolicy , yeniden deneme sayısı 10 olan bir SqlDatabaseTransientErrorDetectionStrategy ve yeniden denemeler arasında 5 saniye bekleme süresi olarak tanımlanır. İşlemler kullanıyorsanız, geçici bir hata durumunda yeniden deneme kapsamınızın işlemin başına geri döndüğünden emin olun.

Sınırlamalar

Bu belgede özetlenen yaklaşımlar birkaç sınırlama gerektirir:

  • Bu belgenin örnek kodu, parçalar arasında şemanın nasıl yönetileceğini göstermez.
  • bir istek verildiğinde, tüm veritabanı işlemesinin istek tarafından sağlanan parçalama anahtarı tarafından tanımlanan tek bir parça içinde yer aldığı varsayılır. Ancak bu varsayım, örneğin parçalama anahtarının kullanılabilir hale getirilmemesi gibi durumlarda her zaman geçerli değildir. Bu sorunu çözmek için elastik veritabanı istemci kitaplığı MultiShardQuery sınıfını içerir. sınıfı, çeşitli parçalar üzerinde sorgulama için bir bağlantı soyutlaması uygular. MultiShardQuery'nin Dapper ile birlikte kullanılması bu belgenin kapsamının dışındadır.

Sonuç

Dapper ve DapperExtensions kullanan uygulamalar, Azure SQL Veritabanı için esnek veritabanı araçlarından kolayca yararlanabilir. Bu belgede açıklanan adımlarda, bu uygulamalar yeni Sql Bağlan ion nesnelerinin oluşturulmasını ve açılmasını elastik veritabanı istemci kitaplığının Open Bağlan ionForKey çağrısını kullanacak şekilde değiştirerek veriye bağımlı yönlendirme için aracın özelliğini kullanabilir. Bu, yeni bağlantıların oluşturulduğu ve açıldığı yerlerde gerekli olan uygulama değişikliklerini sınırlar.

Ek kaynaklar

Elastik veritabanı araçlarını henüz kullanmıyor musunuz? Başlarken Kılavuzumuza göz atın. Sorular için, SQL Veritabanı ve özellik istekleri için Microsoft Soru-Cevap soru sayfasından bizimle iletişime geçin, yeni fikirler ekleyin veya SQL Veritabanı geri bildirim forumunda mevcut fikirler için oy verin.