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

Bir veritabanı sunucusuna bağlanmak genellikle zaman alan birkaç adımdan oluşur. Yuva veya adlandırılmış kanal gibi fiziksel bir kanal oluşturulmalıdır, sunucuyla ilk el sıkışma gerçekleşmelidir, bağlantı dizesi bilgilerin ayrıştırılması, bağlantının sunucu tarafından kimliğinin doğrulanması, denetimlerin geçerli işlemde listelenmek üzere çalıştırılması vb. gerekir.

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.

Bağlantı havuzu, yeni bağlantıların kaç kez açılması gerektiğini azaltır. Havuz oluşturucu, 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ı bir bağlantıyı her aradığında Open , havuz oluşturucu havuzda kullanılabilir bir bağlantı arar. Havuza alınan bir bağlantı varsa, yeni bir bağlantı açmak yerine bunu çağırana döndürür. Uygulama bağlantıyı çağırdığında Close , havuz oluşturucu 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. kullanılırkenChangePasswordSqlCredential, örnek 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. Bağlantı havuzu varsayılan olarak ADO.NET etkindir. Açıkça devre dışı bırakmadığınız sürece, havuz oluşturucu bağlantıları uygulamanızda açıldı ve kapatılırken iyileştirir. 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.

bağlantı dizesi belirtilmezse veya sıfır olarak belirtilirseMin Pool Size, havuzdaki bağlantılar bir süre etkinlik dışı kaldıktan sonra kapatılır. Ancak, belirtilen Min Pool Size sıfırdan büyükse, bağlantı havuzu kaldırılana AppDomain 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 önemli 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 atı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. Havuz oluşturucu daha sonra zaman aşımına ulaşılana kadar tüm bağlantıları geri almaya çalışır (varsayılan değer 15 saniyedir). 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: Visual Basic için Sistem Kaynağını Atma.

Not

sınıfınızın yönteminde Connection, bir veya başka bir DataReaderyönetilen nesne üzerinde Finalize veya çağırmayın Close Dispose. 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 oluşturucu, yaklaşık 4-8 dakika boşta kalan bir bağlantıyı havuzdan kaldırır veya havuz oluşturucu sunucuyla bağlantının kesildiğini algılarsa. 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.

Kaybolan bir sunucuya bağlantı varsa, bağlantı havuzu oluşturucu ayrılmış bağlantıyı algılamamış ve geçersiz olarak işaretlememiş olsa bile bu bağlantı 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 çekilir ve işlem bağlamı temelinde atanır. bağlantı dizesi belirtilmediği süreceEnlist=false, bağlantı havuzu bağlantının bağlamda listelendiğinden Current 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ı temelinde havuza ve uygun alt bölüme geri serbest 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üklerle bağlantı havuzunu denetleme

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ı havuza eklenir 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ı, veritabanına ilk bağlantı master oluşturmayı ve ardından dize değişkeninde belirtilen istenen veritabanına geçmeyi databaseName 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

Sistem saklı yordamı çağrılarak sp_setapprole bir SQL Server uygulama rolü etkinleştirildikten sonra, bu bağlantının güvenlik bağlamı 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.