Sorguyu uygun bir veritabanına yönlendirmek için verilere bağımlı yönlendirmeyi kullanma

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

Verilere bağımlı yönlendirme , isteği uygun bir veritabanına yönlendirmek için sorgudaki verileri kullanabilme özelliğidir. Verilere bağımlı yönlendirme, parçalı veritabanlarıyla çalışırken temel bir desendir. İstek bağlamı, özellikle parçalama anahtarı sorgunun parçası değilse isteği yönlendirmek için de kullanılabilir. Verilere bağımlı yönlendirme kullanan bir uygulamadaki belirli her sorgu veya işlem, istek başına bir veritabanına erişimle sınırlıdır. Azure SQL Veritabanı elastik araçlar için bu yönlendirme ShardMapManager (Java, .NET) sınıfıyla gerçekleştirilir.

Uygulamanın parçalı ortamdaki farklı veri dilimleriyle ilişkili çeşitli bağlantı dizesi veya veritabanı konumlarını izlemesi gerekmez. Bunun yerine, Parça Eşleme Yöneticisi gerektiğinde, parça eşlemesindeki verilere ve uygulamanın isteğinin hedefi olan parçalama anahtarının değerine bağlı olarak doğru veritabanlarıyla bağlantıları açar. Anahtar genellikle veritabanı isteğinin temel parametresi olan customer_id, tenant_id, date_key veya başka belirli bir tanımlayıcıdır.

Daha fazla bilgi için bkz . Verilere Bağımlı Yönlendirme ile SQL Server'ın Ölçeğini Genişletme.

İstemci kitaplığını indirme

İndirmek için:

Verilere bağımlı yönlendirme uygulamasında ShardMapManager kullanma

Uygulamaların başlatma sırasında GetSQLShardMapManager (Java, .NET) fabrika çağrısını kullanarak ShardMapManager örneğini oluşturması gerekir. Bu örnekte hem ShardMapManager hem de içerdiği belirli bir ShardMap başlatılır. Bu örnekte GetSqlShardMapManager ve GetRangeShardMap (Java, .NET) yöntemleri gösterilmektedir.

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

Parça eşlemesini almak için mümkün olan en düşük ayrıcalık kimlik bilgilerini kullanın

Bir uygulama parça eşlemesinin kendisini değiştirmiyorsa, fabrika yönteminde kullanılan kimlik bilgilerinin Genel Parça Eşlemesi veritabanında salt okunur izinleri olmalıdır. Bu kimlik bilgileri genellikle parça eşleme yöneticisine bağlantıları açmak için kullanılan kimlik bilgilerinden farklıdır. Ayrıca bkz. Elastik Veritabanı istemci kitaplığına erişmek için kullanılan kimlik bilgileri.

OpenConnectionForKey yöntemini çağırma

ShardMap.OpenConnectionForKey yöntemi (Java, .NET), anahtar parametresinin değerine göre uygun veritabanına komutlar vermek için hazır bir bağlantı döndürür. Parça bilgileri ShardMapManager tarafından uygulamada önbelleğe alınır, bu nedenle bu istekler genellikle Genel Parça Eşleme veritabanında veritabanı araması içermez.

// Syntax:
public Connection openConnectionForKey(Object key, String connectionString, ConnectionOptions options)
// Syntax:
public SqlConnection OpenConnectionForKey<TKey>(TKey key, string connectionString, ConnectionOptions options)
  • Anahtar parametresi, istek için uygun veritabanını belirlemek üzere parça eşlemesinde arama anahtarı olarak kullanılır.
  • connectionString yalnızca istenen bağlantı için kullanıcı kimlik bilgilerini geçirmek için kullanılır. Yöntem ShardMap kullanarak veritabanını ve sunucuyu belirlediğinden, bu connectionString'e veritabanı adı veya sunucu adı dahil değildir.
  • connectionOptions (Java, .NET) ConnectionOptions.Validate olarak ayarlanmalıdır. Parça eşlemelerinin değişebileceği ve satırların bölme veya birleştirme işlemleri sonucunda diğer veritabanlarına taşınabileceği bir ortam olup olmadığını doğrulayın. Bu doğrulama, bağlantı uygulamaya teslim edilmeden önce hedef veritabanındaki yerel parça eşlemesine (genel parça eşlemesine değil) yönelik kısa bir sorgu içerir.

Yerel parça eşlemesine karşı doğrulama başarısız olursa (önbelleğin yanlış olduğunu gösterir), Parça Eşleme Yöneticisi arama için yeni doğru değeri almak, önbelleği güncelleştirmek ve uygun veritabanı bağlantısını almak ve döndürmek için genel parça eşlemesini sorgular.

ConnectionOptions.None dosyasını yalnızca bir uygulama çevrimiçiyken parça eşleme değişiklikleri beklenmediği durumlarda kullanın. Bu durumda, önbelleğe alınan değerlerin her zaman doğru olduğu varsayılabilir ve hedef veritabanına yönelik ek gidiş dönüş doğrulama çağrısı güvenle atlanabilir. Bu, veritabanı trafiğini azaltır. ConnectionOptions, parçalama değişikliklerinin belirli bir süre içinde beklenip beklenmediğini belirtmek için yapılandırma dosyasındaki bir değer aracılığıyla da ayarlanabilir.

Bu örnekte customerShardMap adlı bir ShardMap nesnesi kullanılarak CustomerID adlı bir tamsayı anahtarı kullanılır.

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

OpenConnectionForKey yöntemi, doğru veritabanına zaten açık olan yeni bir bağlantı döndürür. Bu şekilde kullanılan bağlantılar yine de bağlantı havuzundan tam olarak yararlanır.

Uygulamanız zaman uyumsuz programlama kullanıyorsa OpenConnectionForKeyAsync yöntemi (Java, .NET) de kullanılabilir.

Geçici hata işleme ile tümleştirme

Bulutta veri erişim uygulamaları geliştirmenin en iyi uygulamalarından biri, geçici hataların uygulama tarafından yakalanmasını ve işlemlerin hata oluşturmadan önce birkaç kez yeniden denenmesini sağlamaktır. Bulut uygulamaları için geçici hata işleme, Geçici Hata İşleme (Java, .NET) konusunda ele alınmıştı.

Geçici hata işleme, Verilere Bağımlı Yönlendirme düzeniyle doğal olarak bir arada bulunabilir. Temel gereksinim, veriye bağımlı yönlendirme bağlantısını elde eden using bloğu da dahil olmak üzere veri erişim isteğinin tamamını yeniden denemektir. Yukarıdaki örnek aşağıdaki gibi yeniden yazılabilir.

Örnek - geçici hata işleme ile verilere bağımlı yönlendirme

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

Geçici hata işlemeyi uygulamak için gerekli paketler, elastik veritabanı örnek uygulamasını derlediğinizde otomatik olarak indirilir.

İşlem tutarlılığı

Bir parçaya yerel tüm işlemler için işlem özellikleri garanti edilir. Örneğin, verilere bağımlı yönlendirme aracılığıyla gönderilen işlemler, bağlantının hedef parçası kapsamında yürütülür. Şu anda, bir işleme birden çok bağlantı listelemek için sağlanan bir özellik yoktur ve bu nedenle parçalar arasında gerçekleştirilen işlemler için işlem garantisi yoktur.

Sonraki adımlar

Parça ayırmak veya bir parçayı yeniden eklemek için bkz . Parça eşleme sorunlarını düzeltmek için RecoveryManager sınıfını kullanma.

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.