Aracılığıyla paylaş


SQL Server bağlantı havuzu (ADO.NET)

Bir veritabanı sunucusuna bağlanmak genellikle zaman alan birkaç adımdan oluşur. Soket veya adlandırılmış kanal gibi fiziksel bir kanal oluşturulmalı, sunucuyla ilk el sıkışma gerçekleştirilmelidir, bağlantı dizesi bilgileri ayrıştırılmalı, bağlantının kimliği sunucu tarafından doğrulanmalı, mevcut işleme kaydolma denetimleri yapılmalıdır, vb.

Uygulamada çoğu uygulama bağlantılar için yalnızca bir veya birkaç farklı yapılandırma kullanır. Bu, uygulama yürütme sırasında birçok özdeş bağlantının tekrar tekrar açılacağı ve kapatılacağı anlamına gelir. ADO.NET, bağlantıları açma maliyetini en aza indirmek için bağlantı havuzu adı verilen bir iyileştirme tekniği kullanır.

Not

ADO.NET'da bağlantı havuzu, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve SQL Server (şirket içi veya sanal makinelerde (VM)) dahil olmak üzere tüm SQL Server tabanlı ortamlarda tutarlı bir şekilde çalışır. Havuz mekanizması tamamen istemci tarafında ve bu platformlarda aynı şekilde çalışır. Ancak hizmete özgü faktörler havuz verimliliğini etkileyebilir: Azure SQL Veritabanı, seçilen hizmet katmanına (temel, Standart, Premium gibi) göre bağlantı sınırlarını zorlarken, Azure SQL Yönetilen Örneği bağlantı sınırlarını sanal çekirdekler ve bellek gibi örneğin ayrılmış kaynaklarına bağlar. Buna karşılık, VM'lerdeki SQL Server'ın donanım ve lisanslama kısıtlamalarının ötesinde zorlanmış sınırları yoktur ve en fazla esnekliği sunar.

Bağlantı havuzu, yeni bağlantıların kaç kez açılması gerektiğini azaltır. Havuzlayıcı, fiziksel bağlantının sahipliğini korur. Verilen her bağlantı yapılandırması için bir dizi etkin bağlantıyı etkin tutarak bağlantıları yönetir. Bir kullanıcı Open bir bağlantıyı her aradığında, bağlantı havuzu yöneticisi havuzda kullanılabilir bir bağlantı arar. Havuza alınan bir bağlantı varsa, yeni bir bağlantı açmak yerine bunu çağırana geri verir. Uygulama bağlantı üzerinde Close çağırdığında, havuzlayıcı bunu kapatmak yerine havuza alınan etkin bağlantı kümesine döndürür. Bağlantı havuza döndürüldükten sonra bir sonraki Open çağrıda yeniden kullanılabilir.

Yalnızca aynı yapılandırmaya sahip bağlantılar havuza alınabiliyor. ADO.NET, her yapılandırma için bir havuz olmak üzere aynı anda birkaç havuz tutar. Bağlantılar bağlantı dizesi ve tümleşik güvenlik kullanıldığında Windows kimliğine göre havuzlara ayrılır. Bağlantılar, bir işlemde listelenip listelenmediklerine göre de havuza alınmaktadır. ChangePassword kullanılırken, SqlCredential örneği bağlantı havuzunu etkiler. Kullanıcı kimliği ve parola aynı olsa bile farklı örnekleri SqlCredential farklı bağlantı havuzları kullanır.

Havuz bağlantıları, uygulamanızın performansını ve ölçeklenebilirliğini önemli ölçüde artırabilir. ADO.NET'te bağlantı havuzu varsayılan olarak etkindir. Açıkça devre dışı bırakmadığınız sürece, bağlantı havuzu uygulamanızda bağlantılar açılır ve kapanırken optimize eder. Bağlantı havuzu davranışını denetlemek için birkaç bağlantı dizesi değiştirici de sağlayabilirsiniz. Daha fazla bilgi için bu konunun devamında yer alan "Bağlantı Dizesi Anahtar Sözcükleriyle Bağlantı Havuzunu Denetleme" konusuna bakın.

Not

Bağlantı havuzu etkinleştirildiğinde ve bir zaman aşımı hatası veya başka bir oturum açma hatası oluşursa, bir özel durum oluşturulur ve sonraki bağlantı denemeleri sonraki beş saniye (engelleme süresi) başarısız olur. Uygulama engelleme süresi içinde bağlanmayı denerse, ilk özel durum yeniden oluşturulur. Bir engelleme süresi sona erdikten sonra oluşan sonraki hatalar, bir önceki engelleme süresinden iki kat daha uzun ve en fazla bir dakika olan yeni bir engelleme süresine neden olur.

Havuz oluşturma ve atama

Bir bağlantı ilk açıldığında, havuzu bağlantıdaki bağlantı dizesi ile ilişkilendiren tam eşleştirme algoritmasına dayalı olarak bir bağlantı havuzu oluşturulur. Her bağlantı havuzu ayrı bir bağlantı dizesi ile ilişkilendirilir. Yeni bir bağlantı açıldığında, bağlantı dizesi var olan bir havuzla tam olarak eşleşmediyse yeni bir havuz oluşturulur. Bağlantılar işlem başına, uygulama etki alanı başına, bağlantı dizesi başına ve tümleşik güvenlik kullanıldığında Windows kimliğine göre havuza alınır. Bağlantı dizeleri de tam olarak eşleşmelidir; aynı bağlantı için farklı bir sırada sağlanan anahtar sözcükler ayrı olarak havuza alınacaktır.

Aşağıdaki C# örneğinde üç yeni SqlConnection nesne oluşturulur, ancak bunları yönetmek için yalnızca iki bağlantı havuzu gerekir. birinci ve ikinci bağlantı dizesi için atanan Initial Catalogdeğere göre farklılık gösterdiğine dikkat edin.

using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();
        // Pool A is created.
    }

using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=pubs"))
    {
        connection.Open();
        // Pool B is created because the connection strings differ.
    }

using (SqlConnection connection = new SqlConnection(
  "Integrated Security=SSPI;Initial Catalog=Northwind"))
    {
        connection.Open();
        // The connection string matches pool A.
    }

Önemli

Microsoft, kullanılabilir en güvenli kimlik doğrulama akışını kullanmanızı önerir. Azure SQL'e bağlanıyorsanız önerilen kimlik doğrulama yöntemi Azure kaynakları için Yönetilen Kimlikler'dir.

Eğer Min Pool Size bağlantı dizesinde belirtilmemişse veya sıfır olarak belirtilmişse, havuzdaki bağlantılar bir süre etkinlik dışı kaldıktan sonra kapatılacaktır. Ancak, belirtilen Min Pool Size sıfırdan büyükse, bağlantı havuzu yükten kaldırılana ve işlem sona erene kadar yok olmaz. Etkin olmayan veya boş havuzların bakımı minimum sistem yükü gerektirir.

Not

Yük devretme gibi ölümcül bir hata oluştuğunda havuz otomatik olarak temizlenir.

Bağlantı ekleme

Her benzersiz bağlantı dizesi için bir bağlantı havuzu oluşturulur. Bir havuz oluşturulduğunda, en düşük havuz boyutu gereksiniminin karşılanması için birden çok bağlantı nesnesi oluşturulur ve havuza eklenir. Bağlantılar, belirtilen en büyük havuz boyutuna kadar (varsayılan değer 100'dür) gerektiği gibi havuza eklenir. Bağlantılar kapatıldığında veya kullanımdan kaldırıldığında havuza geri bırakılır.

Bir SqlConnection nesne istendiğinde, kullanılabilir bir bağlantı varsa havuzdan alınır. Kullanılabilir olması için bağlantının kullanılmaması, eşleşen bir işlem bağlamı olması veya herhangi bir işlem bağlamıyla ilişkilendirilmemiş olması ve sunucuya geçerli bir bağlantısı olması gerekir.

Bağlantı havuzu oluşturucu, yeniden havuza gönderilen bağlantıları yeniden ayırarak bağlantı isteklerini karşılar. Havuz boyutu üst sınırına ulaşıldıysa ve kullanılabilir bağlantı yoksa istek kuyruğa alınır. Bağlantı havuzu yöneticisi, zaman aşımı süresine (varsayılan 15 saniye) ulaşılana kadar tüm bağlantıları geri kazanmaya çalışır. Havuz oluşturucu bağlantı zaman aşımına uğramadan önce isteği karşılayamazsa bir özel durum oluşur.

Dikkat

Bağlantının havuza döndürülmesi için, kullanmayı bitirdiğinizde bağlantıyı her zaman kapatmanızı kesinlikle öneririz. Bunu, nesnenin Close veya Dispose yöntemlerini Connection kullanarak ya da C# dilinde bir using deyimin içindeki tüm bağlantıları veya Visual Basic'teki bir Using deyimi açarak yapabilirsiniz. Açıkça kapatılmayan bağlantılar havuza eklenmeyebilir veya döndürülmeyebilir. Daha fazla bilgi için bkz using deyimi veya Nasıl yapılır: Bir Sistem Kaynağını Atma Visual Basic için.

Not

Sınıfınızın Finalize yönteminde Connection, DataReader veya başka bir yönetilen nesne üzerinde Close veya Dispose çağırmayın. Sonlandırıcıda yalnızca sınıfınızın doğrudan sahip olduğu yönetilmeyen kaynakları serbest bırakın. Sınıfınız yönetilmeyen kaynaklara sahip değilse, sınıf tanımınıza bir Finalize yöntem eklemeyin. Daha fazla bilgi için bkz . Çöp Toplama.

Bağlantıları açma ve kapatmayla ilişkili olaylar hakkında daha fazla bilgi için SQL Server belgelerindeki Oturum Açma Olay Sınıfını Denetleme ve Oturumu Kapatma Olay Sınıfını Denetleme konularına bakın.

Bağlantıları kaldırma

Bağlantı havuzu yöneticisi, yaklaşık 4-8 dakika boşta kalan bir bağlantıyı havuzdan kaldırır veya sunucuyla bağlantının kesildiğini algılarsa havuzdan çıkarır. Ayrılmış bir bağlantının ancak sunucuyla iletişim kurmaya çalışıldıktan sonra algılanabilir olduğunu unutmayın. Artık sunucuya bağlı olmayan bir bağlantı bulunursa, geçersiz olarak işaretlenir. Geçersiz bağlantılar yalnızca kapatıldığında veya geri kazanıldığında bağlantı havuzundan kaldırılır.

Kaybolmuş bir sunucuya bağlantı mevcutsa, bağlantı havuzu yöneticisi ayrılmış bağlantıyı algılamamış ve geçersiz olarak işaretlememiş olsa bile bu bağlantı yine de havuzdan çekilebilir. Bu durum, bağlantının hala geçerli olup olmadığını denetleme yükünün sunucuya başka bir gidiş dönüşe neden olarak bir havuz oluşturucuya sahip olmanın avantajlarını ortadan kaldırması nedeniyle oluşur. Bu gerçekleştiğinde, bağlantıyı kullanmaya yönelik ilk girişim, bağlantının kesildiğini algılar ve bir özel durum oluşturulur.

Havuzu temizleme

ADO.NET 2.0, havuzu temizlemek için iki yeni yöntem kullanıma sunulmuştur: ClearAllPools ve ClearPool. ClearAllPools belirli bir sağlayıcının bağlantı havuzlarını temizler ve ClearPool belirli bir bağlantıyla ilişkili bağlantı havuzunu temizler. Çağrı sırasında kullanılan bağlantılar varsa, uygun şekilde işaretlenir. Kapatıldığında, havuza döndürülmek yerine atılırlar.

İşlem desteği

Bağlantılar havuzdan alınır ve işlem bağlamı temelinde atanır. tr-TR: Bağlantı dizesi Enlist=false belirtilmediği sürece, bağlantı havuzu bağlantının Current bağlamında listelendiğinden emin olur. Bir bağlantı kapatılıp listeye alınmış System.Transactions bir işlemle havuza geri döndürülürse, aynı System.Transactions işlemle ilgili bir sonraki bağlantı havuzu isteği kullanılabilir olduğunda aynı bağlantıyı döndürecek şekilde ayrılır. Böyle bir istek verilirse ve kullanılabilir havuza alınmış bağlantı yoksa, havuzun işlem yapılmayan bölümünden bir bağlantı çizilir ve listeye eklenir. Havuzun iki alanında da kullanılabilir bağlantı yoksa yeni bir bağlantı oluşturulur ve listeye eklenir.

Bir bağlantı kapatıldığında, işlem bağlamına uygun olan alt bölüme ve havuza geri bırakılır. Bu nedenle, dağıtılmış bir işlem hala beklemede olsa bile bir hata oluşturmadan bağlantıyı kapatabilirsiniz. Bu, dağıtılmış işlemi daha sonra işlemenize veya durdurmanıza olanak tanır.

bağlantı dizesi anahtar sözcükleriyle bağlantı havuzunu kontrol etme

ConnectionString nesnesinin özelliği, bağlantı havuzu mantığının SqlConnection davranışını ayarlamak için kullanılabilecek bağlantı dizesi anahtar/değer çiftlerini destekler. Daha fazla bilgi için bkz. ConnectionString.

Havuz parçalanması

Havuz parçalanması, uygulamanın işlemden çıkana kadar serbest olmayan çok sayıda havuz oluşturabildiği birçok Web uygulamasında sık karşılaşılan bir sorundur. Bu, çok sayıda bağlantıyı açık bırakır ve bellek tüketerek performansın düşmesine neden olur.

Tümleşik güvenlik nedeniyle havuz parçalanması

Bağlantılar, bağlantı dizesi ve kullanıcı kimliğine göre havuza alınıyor. Bu nedenle, Web sitesinde Temel kimlik doğrulaması veya Windows Kimlik Doğrulaması ve tümleşik bir güvenlik oturumu kullanıyorsanız, kullanıcı başına bir havuz elde edersiniz. Bu, tek bir kullanıcı için sonraki veritabanı isteklerinin performansını artırsa da, bu kullanıcı diğer kullanıcılar tarafından yapılan bağlantılardan yararlanamaz. Ayrıca kullanıcı başına veritabanı sunucusuna en az bir bağlantı elde eder. Bu, geliştiricilerin güvenlik ve denetim gereksinimlerine karşı tartması gereken belirli bir Web uygulaması mimarisinin yan etkisidir.

Birçok veritabanı nedeniyle havuz parçalanması

Birçok İnternet hizmeti sağlayıcısı, tek bir sunucuda birkaç Web sitesi barındırıyor. Form kimlik doğrulaması oturum açma bilgilerini onaylamak ve ardından bu kullanıcı veya kullanıcı grubu için belirli bir veritabanına bağlantı açmak için tek bir veritabanı kullanabilirler. Kimlik doğrulama veritabanına bağlantı havuzda toplanır ve herkes tarafından kullanılır. Ancak, her veritabanına yönelik ayrı bir bağlantı havuzu vardır ve bu da sunucuya yönelik bağlantı sayısını artırır.

Bu aynı zamanda uygulama tasarımının yan etkisidir. SQL Server'a bağlandığınızda güvenlikten ödün vermeden bu yan etkiyi önlemenin nispeten basit bir yolu vardır. Her kullanıcı veya grup için ayrı bir veritabanına bağlanmak yerine, sunucudaki aynı veritabanına bağlanın ve ardından transact-SQL USE deyimini yürüterek istenen veritabanına geçin. Aşağıdaki kod parçası, ilk master veritabanına bağlantı oluşturmayı ve ardından databaseName dize değişkeninde belirtilen istenen veritabanına geçmeyi gösterir.

' Assumes that command is a SqlCommand object.
command.Text = "USE DatabaseName"
Using connection As New SqlConnection(connectionString)
    connection.Open()
    command.ExecuteNonQuery()
End Using
// Assumes that command is a SqlCommand object.
command.Text = "USE DatabaseName";
using (SqlConnection connection = new SqlConnection(
  connectionString))
  {
    connection.Open();
    command.ExecuteNonQuery();
  }

Uygulama rolleri ve bağlantı havuzu

sp_setapprole sistem saklı yordamı çağrılarak bir SQL Server uygulama rolü etkinleştirildikten sonra, bu bağlantının güvenlik bağlamı geri sıfırlanamaz. Ancak havuz oluşturma etkinse, havuza bağlantı döndürülür ve havuza alınan bağlantı yeniden kullanıldığında bir hata oluşur.

Ayrıca bkz.