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

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

Bu belge, Uygulamaları oluşturmak için Dapper'ı kullanan ancak veri katmanlarının ölçeğini 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önetimi ve verilere bağımlı yönlendirme oluşturmak üzerinde 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ığındanOpenConnectionForKey çağrısını kullanmak üzere yeni SqlConnection 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şturulup açılmasıyla sınırlar.

Dapper'a genel bakış

Dapper , nesne-ilişkisel eşleyicidir. Uygulamanızdaki .NET nesnelerini ilişkisel 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ü, hem Dapper hem de DapperExtensions kullanılırken tümleştirmeyi gösterir.

Dapper'daki eşleyici işlevi, veritabanı bağlantılarında yürütme veya veritabanını sorgulamak 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ıklarla 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 olarak adlandırılan bölümlerini tanımlar, veritabanlarına eşler ve bunları parçalama anahtarlarıyla tanımlarsınız. İhtiyacınız olan sayıda veritabanına sahip olabilir ve parçacıkları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.

Parça eşlemeleri ve verilere bağımlı yönlendirme

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şturulan bir uygulama için veritabanı bağlantılarını aracılık eder. Parça yönetimi işlemlerinin parçacık üzerinde etkisi olabileceği durumlarda, 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 OpenConnectionForKey yöntemini kullanmanız gerekir. Bu, tüm doğrulamanı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çalı uygulamanın veri katmanına veritabanları eklemek veya kaldırmak istiyoruz.
  • Tutarlılık: Uygulamanın ölçeği parçalama kullanılarak genişletildiğinden, verilere bağımlı 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çaya yönelik bağlantıların reddedilmesini veya (örneğin) parçanın şu anda Bölünmüş/Birleştirme API'leri kullanılarak farklı bir parçaya taşınması durumunda durdurulmasını sağlar.
  • Nesne Eşleme: Uygulamadaki sınıflar ile temel alınan veritabanı yapıları arasında çeviri yapmak için Dapper tarafından sağlanan eşlemelerin kolaylığı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ı bağlantılarını oluşturmak ve açmakla sorumludur. Uygulamaya göre T türü verüldüğünde, 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 SqlConnection 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 SqlConnection nesneleridir. Bu da basit bir SQL İstemcisi bağlantısı olduğundan istemci kitaplığının DDR API'sinin döndürdiği tür üzerinde Dapper uzantılarını doğrudan kullanmamıza olanak tanır.

Bu gözlemler, Dapper için elastik veritabanı istemci kitaplığı tarafından aracılık edilen 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ının aracılık etmesi 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 }
                        );
    }

OpenConnectionForKey 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. OpenConnectionForKey ç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ımlamak için parçalama anahtarı
  • 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. OpenConnectionForKey çağrısı normal bir SQL İstemcisi bağlantı nesnesi döndürdüğünden, Dapper'dan yürütme uzantısı yöntemine yapılan sonraki çağrı standart Dapper uygulamasını izler.

Sorgular aynı şekilde çalışır; önce istemci API'sinden OpenConnectionForKey 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 kadar tamamladığına dikkat edin. 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 biçimini 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 OpenConnectionForKey'e güvenebiliriz. Aşağıdaki kod örneklerinde gösterildiği gibi, tek değişiklik artık T-SQL deyimlerini yazmanız gerekmeyecek olmasıdı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 Patterns & Practices 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, şemanın parçalar arasında 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. Bunu gidermek için elastik veritabanı istemci kitaplığı MultiShardQuery sınıfını içerir. sınıfı, çeşitli parçalar üzerinde sorgulamak için bir bağlantı soyutlaması uygular. MultiShardQuery'yi Dapper ile birlikte kullanmak 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 özetlenen adımlar aracılığıyla, bu uygulamalar yeni SqlConnection nesnelerinin oluşturulmasını ve açılmasını elastik veritabanı istemci kitaplığının OpenConnectionForKey çağrısını kullanacak şekilde değiştirerek aracın verilere bağımlı yönlendirme özelliğini kullanabilir. Bu, yeni bağlantıların oluşturulduğu ve açıldığı yerlerde gereken 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.