Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ş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 bir 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, .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öneticisiyle veritabanlarının ölçeğini genişletme , 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ına 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:
- Kitaplığın Java sürümü, bkz . Maven Central Repository.
- Kitaplığın .NET sürümü, bkz . NuGet.
Verilere bağımlı yönlendirme uygulamasında ShardMapManager kullanma
Uygulamalar, fabrika çağrısını ShardMapManagerGetSQLShardMapManager (Java, .NET) kullanarak başlatma sırasında örneğini oluşturmalıdır. Bu örnekte, hem bir ShardMapManager hem de onun 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), parametresinin key değerine göre uygun veritabanına komut vermeye hazır bir bağlantı döndürür. Uygulamada parça bilgileri ShardMapManager tarafından önbelleğe alınır, bu nedenle bu istekler genellikle Genel Parça Eşleme veritabanında bir 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)
-
keyparametresi, istek için uygun veritabanını belirlemek üzere parça eşlemesinde arama anahtarı olarak kullanılır. -
connectionStringyalnızca istenen bağlantı için kullanıcı kimlik bilgilerini geçirmek için kullanılır. yöntemi kullanarak veritabanını ve sunucuyu belirlediğinden buShardMapveritabanı adı veya sunucu adı dahil değildir. - Bir ortamda
connectionOptionsparça eşlemeleri değişebiliyorsa ve bölme veya birleştirme işlemleri sonucunda satırlar diğer veritabanlarına taşınabiliyorsa, (Java, .NET)ConnectionOptions.Validateolarak ayarlanmalıdır. 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.
Yalnızca bir uygulama çevrimiçiyken parça eşleme değişiklikleri beklenmediği durumlarda kullanın ConnectionOptions.None . 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, CustomerID adlı bir nesne kullanılarak, bir tamsayı anahtarının ShardMap değeri kullanılır customerShardMap.
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ıyı geri verir. Bu şekilde kullanılan bağlantılar yine de bağlantı havuzundan tam olarak yararlanır.
Uygulamanız asenkron programlama kullanıyorsa, OpenConnectionForKeyAsync yöntemi (Java, .NET) de kullanılabilir.
Geçici hata işleme ile entegre etme
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ım
İlgili içerik
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.