Microsoft.Data.SqlClient ile SQL Server bağlantı havuzu oluşturma

Microsoft. Data.SqlClient bağlantı havuzu, kimlik doğrulamalı fiziksel bağlantıları yeniden kullanır. SqlConnection.Open ya da OpenAsync bir havuzda kullanılabilir bir bağlantı olup olmadığını kontrol eder. Close, Dispose, veya DisposeAsync sıfırlayıp geri döndürür. Bu yaklaşım, her işlem için ağ bağlantısı, kimlik doğrulama ve oturum kurulumundan kaçınır.

Havuzlama varsayılan olarak etkinleştirilmiştir. Bu uygulama modelini kullanın:

await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(cancellationToken);

using var command = new SqlCommand(sql, connection);
await command.ExecuteNonQueryAsync(cancellationToken);

Geç aç, erken kapat ve fiziksel bağlantıları havuzun yönetmesine izin ver. Bir SqlConnection tane küresel olarak açık tutmayın.

Havuz anahtarlarını anlamak

Bir bağlantı yalnızca karşılık gelen havuzdan yeniden kullanılabilir. Havuz anahtarı, hedef sunucudan daha fazlasını içerir.

Input Havuz davranışı
Bağlantı dizesi Metin tam olarak eşleşmeli. Anahtar kelime sırası farklılıkları, etkili ayarlar eşdeğer olsa bile ayrı havuzlar oluşturur.
Windows tümleşik kimlik doğrulaması Windows kimliği anahtarın bir parçasıdır. Farklı kimlikler altında kullanılan aynı dizi farklı havuzlar oluşturur.
SqlCredential Nesne örneği anahtarın bir parçasıdır. Ayrı örnekler, aynı kullanıcı adı ve şifreyi içerseler bile ayrı havuzlar oluşturur.
SqlConnection.AccessToken Erişim token değeri anahtarın bir parçasıdır. Token dizelerini değiştirmek, yeni havuzlar oluşturabilir ve mevcut havuzlarda eski token'larla kimliği doğrulanmış bağlantılar bırakabilir.
SqlConnection.AccessTokenCallback Geri çağrı, anahtarın bir parçasıdır. Aynı çağrı örneğini, havuzu paylaşması gereken bağlantılar için tekrar kullanın. Geri dönen token değeri havuz anahtarı değildir.
Özel SSPI bağlam sağlayıcısı Sağlayıcı örneği bağlantı yapılandırmasına katılır. Aynı havuzda toplanması gereken bağlantılar için tek bir sağlayıcı örneğini yeniden kullanın.
Kapsayıcı işlem Enlisted bağlantılar, eşleştirme havuzu içinde işleme özgü alt bölümler kullanır.

Veritabanı, kimlik doğrulama modu, şifreleme seçenekleri, uygulama adı, havuz seçenekleri ve diğer tüm bağlantı dizesi değerleri, bağlantı dizesinin tam metni üzerinden etkide bulunur.

Bir kanonik bağlantı dizesi oluştur ve tekrar kullan. Application Name, Workstation ID veya diğer anahtar sözcüklerde istek başına değerler kullanmaktan kaçının.

Havuz oluşturabilen token API'lerini seçin

Microsoft Entra ID erişim belirteçleri için Microsoft.Data.SqlClient tarafından sağlanan bir kimlik doğrulama modunu veya kararlı bir AccessTokenCallback kullanın.

AccessTokenCallback, Microsoft.Data.SqlClient 5.2 sürümünde kullanıma sunuldu. Sürücü, bir token’a ihtiyaç duyduğunda bunu çağırır ve yeniden kullanılan bir havuz için yenilenmiş bir token talep edebilir. Sürücünün sağladığı kimlik doğrulama parametreleri için geri çağırmayı deterministik tutun ve aynı temsilci örneğini yeniden kullanın.

Kod, AccessToken öğesini doğrudan ayarladığında:

  • Token dizisi havuz anahtarının bir parçası olur.
  • Uygulama, token süresi dolma ve yenileme sistemlerine sahiptir.
  • Havuzlanmış fiziksel bağlantı, oluşturulmak için kullanılan tokendan daha uzun ömürlü olabilir.
  • Süresi dolmuş bir tokenı değiştirdikten sonra bu havuz artık güvenli bir şekilde kullanılamıyorsa ClearPool çağrısını yapın.

Her istek için yeni bir callback lambda işlevi veya kimlik bilgisi nesnesi oluşturmayın. Nesne kimliği farklılıkları havuzları parçalayabilir.

Microsoft.Data.SqlClient 7.0, özel Kerberos veya NTLM anlaşması için SspiContextProvider desteği ekliyor. Sağlayıcıyı, istek başına durum olarak değil, uygulama kapsamlı bağlantı yapılandırması olarak ele alın.

Her havuzun boyutunu

Bu bağlantı dizesi seçenekleri bir havuzu kontrol eder:

Anahtar kelime Varsayılan Etkisi
Pooling true Havuzlamayı etkinleştirir veya devre dışı bırakır.
Min Pool Size 0 Havuzun oluşturulduktan sonra tutacağı minimum fiziksel bağlantı sayısını belirler.
Max Pool Size 100 Havuzdaki maksimum fiziksel bağlantı sayısını belirler.
Connect Timeout 15 saniye Kullanılabilir bir bağlantı olmadığında Open öğesinin ne kadar süre bekleyeceğini belirler.
Load Balance Timeout 0 Saniye Bir bağlantı, havuza geri döndüğünde yaşı yapılandırılan değeri aşarsa atılır. Connection Lifetime diğer addır.

Havuz, talep arttıkça Max Pool Size sayısına ulaşana kadar bağlantılar oluşturur. Tüm bağlantılar kullanıldığında, bağlantının geri dönmesini beklemek için daha sonra açılır. Bekleme süresi Connect Timeout değerini aşarsa açma işlemi başarısız olur.

Kontrol etmeden önce Max Pool Size yükseltmeyin:

  • Her bağlantı ve okuyucu, her yol üzerinde konumlandırılmıştır.
  • Komutlar ve işlemler hemen tamamlanır.
  • Sorgu iş yükü engellenmiş veya doymuş değil.
  • Veritabanı bağlantı sınırı, her uygulama örneğindeki her havuz için Max Pool Size ile çarpılan değeri karşılayabilir.

Pozitif Min Pool Size bir pozisyon, boş dönemlerde bağlantıları açık tutar. Sadece ölçümler sıcak bağlantıları haklı çıkardığında kullanın. Genellikle sıfıra ölçeklendirme, sunucusuz otomatik duraklatma ve patlanabilir bulut tasarımlarına karşı çalışır.

Varsayılan Load Balance Timeout=0olarak, periyodik temizlik genellikle yukarıdaki Min Pool Size kullanılmayan bağlantıları yaklaşık dört ila sekiz dakika sonra kaldırır veya havuz, sunucu bağlantısının bozulduğunu tespit ettiğinde bağlantıları kaldırır. Bu aralığı uygulama davranışı olarak değerlendirin, bağlantı başına boşta garantisi olarak değil. Havuz, her ödeme öncesi doğrulama sorgusu göndermez çünkü bu gidiş-dönüş havuzlama faydasının büyük bir kısmını ortadan kaldırır.

Kimlik doğrulama engelleme dönemlerini yönetin

Bir kimlik doğrulama zaman aşımından veya diğer bir kimlik doğrulama hatasından sonra, havuz bir blokaj süresine girebilir. Bu süre boyunca, eşleştirme açık denemeler orijinal istisnayı yeniden başlatır ve başka bir kimlik doğrulama girişimi yapmaz.

İlk bloklama periyotu beş saniyedir. Başka bir başarısızlıktan sonra periyot bir dakikaya iki katına çıkar.

Pool Blocking Period Bu davranışı kontrol eder:

Değer Davranış
Auto Sıradan SQL Server uç noktaları için engellemeyi etkinleştirir ve tanınan Azure SQL uç noktası ekleri için bunu devre dışı bırakır. Bir vanity DNS adı Azure davranışını almayabilir.
AlwaysBlock Her uç nokta için engelleme süresini etkinleştirir.
NeverBlock Engelleme süresini devre dışı bırakır.

Uygulamanın ölçülmüş yeniden deneme tasarımı farklı bir seçim gerektirmedikçe Auto değerini koruyun. Engelleme süresinin devre dışı bırakılması, kimlik bilgileri, güvenlik duvarı veya kesinti sorununu kimlik doğrulama fırtınasına dönüştürebilir.

Engelleme süresi, yapılandırılabilir yeniden deneme mantığından ayrıdır. Aynı havuzu engelleme süresi boyunca açan yeniden deneme sağlayıcısı, önbelleklenmiş istisnayı alır.

Bağlantı ömrünü ve temizlemeyi yönetin

Havuz, failover gibi ölümcül bir hatayı fark ettiğinde etkilenen havuzu otomatik olarak temizler. Havuz, boşta bağlantıları kapatır ve geri döndüğünde kapatılmış bağlantıları atıyor.

Bilinen bir yapılandırma veya kimlik sınırı için temizleme API'lerini kullanın:

  • ClearPool tek bir SqlConnection konfigürasyonla ilişkili havuzu temizler.
  • ClearAllPoolssüreç veya uygulama alanındaki tüm Microsoft. Data.SqlClient havuzunu temizler.

Havuz, boşaltılmış bir havuzdaki boşta olan bağlantıları kapatır. Havuz, şu anda kullanılan bağlantıları işaretliyor, bu yüzden geri döndüğünde onları atıyor.

Havuzların temizlenmesi, sonraki açılışların fiziksel girişler yapmasına neden olur. Bunu periyodik bakım, genel bir hata işleyici veya bağlantıların kapatılmasının yerine kullanmayın.

Load Balance Timeout Yaş temelli kademeli değişim sağlar. Bir dağıtımın veya kümelenmiş bir hizmetin eski fiziksel bağlantıların zaman içinde devreden çıkmasını gerektirdiği durumlarda bunu kullanın. Seçilen değerin aşırı sert bağlantılara neden olmadığını doğrulayın.

İşlemleri anlama

Enlist=true, varsayılan olarak, System.Transactions.Transaction.Current içinde açılan bir bağlantı bu işleme otomatik olarak dahil edilir.

Bir kayıtlı bağlantı kapandığında, havuz onu işlem amaçlı bir alt bölüme yerleştirir. Aynı işlem içinde daha sonra yapılan bir açma işlemi, onu yeniden kullanabilir. Fiziksel bağlantı, işlem tamamlanana kadar genel havuza geri dönmez.

Bu nedenle, uzun süren veya yarım bırakılmış örtük işlemler şunlara neden olabilir:

  • Fiziksel bağlantıları genel havuzdan uzak tutun.
  • Mantıksal bağlantı kapandıktan sonra havuz kapasitesini tüketin.
  • Sunucu kilitlerini ve işlem durumunu canlı tutun.

İşlemleri kısa tutun, bunları açıkça sonlandırın ve stasis bağlantılarını izleyin. Enlist=false yalnızca bağlantının ortam işleminin dışında kalması gerekiyorsa ayarlayın.

Havuz parçalanmasını önlemek

Havuz parçalanması, birkaç yeniden kullanılabilir havuz yerine birçok küçük havuz oluşturur. Yaygın nedenler şunlardır:

  • Bağlantı dizisi anahtar kelime sırası veya takma adları farkları.
  • Her müşteri, kullanıcı, istek veya veritabanı için bir bağlantı dizesi.
  • Birçok Windows kimliği altında entegre kimlik doğrulama.
  • Yeni SqlCredential, erişim token geri çağrısı veya SSPI sağlayıcı örnekleri isteğe göre.
  • Her yenilemede değişen doğrudan erişim tokenları.
  • Yüksek kardinaliteli uygulama isimleri veya iş istasyonu kimlikleri.

Bağlantı dizilerini SqlConnectionStringBuilder normalleştirin ve bağlantı oluşturmayı merkezileştirin.

Uygulama kasıtlı olarak birçok veritabanı veya kimliğe bağlanıyorsa, ortaya çıkan havuz sayısını kapasite planlamasına dahil edin. Güvenilmez bir veritabanı adıyla havuzları daraltmak için çalıştırmayın USE . Veritabanı izolasyonu, izinler, oturum durumu ve havuz sıfırlama davranışı açıkça belirtilmelidir.

Uygulama rolleri ve oturum durumunu dikkate alma

Havuz, fiziksel bağlantıyı başka bir mantıksal bağlantıya atamadan önce yeniden kullanılabilir SQL Server oturum durumunu sıfırlar. Uygulama kodu, gerekli tüm oturum durumlarını yine de kendi iş birimi içinde ayarlamalıdır.

sp_setapprole ile etkinleştirilen SQL Server uygulama rolleri, normal havuzlama için güvenli bir şekilde sıfırlanamaz. Veritabanı kullanıcıları, içerikli kullanıcılar, roller, satır düzeyinde güvenlik veya başka bir yetkilendirme tasarımını tercih edin. Bir uygulama rolü kaçınılmazsa, belgelenmiş, çerez tabanlı bir geri alma düzeni kullanın veya test ettikten sonra bu yalıtılmış yol için havuzlamayı devre dışı bırakın.

Okuyucuları serbest bırakın, işlemleri tamamlayın veya geri alın ve bağlantı kapandığında komutları çalışır durumda bırakmayın. Mantıksal bağlantılar arasında geçici tabloların veya diğer oturum durumlarının hayatta kalmasına güvenmeyin.

Bulutta barındırılan havuzlama desenlerini kullanın

Azure App Service, Azure İşlevleri, containers, Kubernetes ve diğer yatay ölçekli hostlar için:

  • Tüm örnekler, süreçler, havuz anahtarları ve replikalar arasında olası veritabanı bağlantılarını hesaplayın.
  • Bağlantı nesnelerinde token dizileri döndürmek yerine yönetilen kimlik veya kararlı erişim token geri çağrısı kullanın.
  • Min Pool Size=0 değerini, yalnızca ölçülmüş bir soğuk başlatma gereksinimi korunan oturumları haklı çıkarıyorsa koruyun.
  • Yeni bir örneğin boş bir havuzla başlamasını bekleyin.
  • Bağlantı dizilerini, aynı iş yükünü karşılayan örnekler arasında aynı tutun.
  • Yük devretme veya ölçeği genişletme sırasında eşzamanlı oturum açma patlamalarını önlemek için bağlantı denemelerini ve yeniden denemeleri sınırlandırın.
  • Azure SQL ve desteklenen diğer birden çok adresli TCP uç noktaları için MultiSubnetFailover=true ayarlayın.

Bağlantı havuzları uygulama işlemine özgüdür. Uygulama örnekleri, konteynerler veya ana bilgisayarlar arasında paylaşılmazlar.

Havuz davranışını teşhis et

SqlClient tanı sayaçlarını kullanarak şunları gözlemleyin:

  • Fiziksel sunucu bağlantılarını temsil eden hard bağlantılar ve bağlantıların kesilmesi.
  • Yumuşak bağlanma ve bağlantı kesme işlemleri, havuzdan alma ve havuza geri verme işlemlerini temsil eder.
  • Aktif ve ücretsiz havuzlu bağlantılar.
  • Aktif havuz grupları ve havuzlar.
  • Stasis bağlantıları.
  • Uygulama kodunun mantıksal bağlantıyı serbest bırakmadığı durumlarda geri kazanılan bağlantılar.

İstemci sayaçlarını SQL Server oturumları, beklemeler, engelleme ve kaynak sınırlarıyla ilişkilendirin. Havuz zaman aşımı, bağlantı sızıntısı, yavaş sorgulamalar, bloklanmış işlemler, aşırı eşzamanlılık, havuz parçalanması veya veritabanı kapasitesi sınırı anlamına gelebilir.

Hedefli havuzlayıcı izleri için olay kaynağı izlemesi kullanın. İzleme çok ayrıntılıdır. Sınırlı bir tanı penceresi için etkinleştirin ve ele geçirilen bağlantı meta verilerini koruyun.

Üretim denetim listesi

  • Pooling özelliğini açık bırakın.
  • Her iş yükü ve veritabanı için bir kanonik bağlantı dizesi'i tekrar kullanın.
  • Her yolda bağlantıları, komutları, okuyucuları ve işlemleri bırakın.
  • Kimlik bilgileri, token geri çağrı ve SSPI sağlayıcı örneklerini yeniden kullanın.
  • Sonlu bağlantı ve komut zaman aşımları ayarlayın.
  • Her uygulama örneği için toplam bağlantı bütçesini boyutlandırın.
  • Hard bağlantıları, havuz sayılarını, ücretsiz bağlantıları, durgunluğu ve zaman aşımlarını izleyin.
  • Havuzları yalnızca, sağlayıcının algılayamadığı bir kimlik bilgisi, belirteç veya yapılandırma sınırı söz konusu olduğunda ya da tanılama verileri eski bağlantıların kaldığını doğruladığında temizleyin.
  • Üretim öncesinde yük testi sırasında yatay ölçeklendirme, yük devretme ve kimlik bilgisi yenileme davranışını test edin.