SQL Server Bağlantı Havuzu (ADO.NET)

Bir veritabanı sunucusuna bağlanmak genellikle birkaç zaman alan adımdan oluşur. Yuva veya adlandırılmış kanal gibi bir fiziksel kanal oluşturulacak, sunucuyla ilk el sıkışması kurulacak, bağlantı dizesi bilgileri ayrıştırılamalı, bağlantının kimliği sunucu tarafından doğrulanmış olmalı, geçerli işlemde liste için denetimler çalıştır olmalıdır ve bu şekilde devam eder.

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çılacak ve kapatılacak olduğu anlamına gelir. Bağlantı açma maliyetini en aza indirmek için ADO.NET havuzu adı verilen bir iyileştirme tekniği kullanır.

Bağlantı havuzu oluşturma, yeni bağlantıların kaç kez açılması gerektiğini azaltır. Havuza alan fiziksel bağlantının sahipliğini sürdürür. Her bağlantı yapılandırması için bir dizi etkin bağlantıyı canlı tutarak bağlantıları yönetir. Kullanıcı bir bağlantıyı Open her çağırsa havuza alan, havuzda kullanılabilir bir bağlantı arar. Havuza bir bağlantı varsa, yeni bir bağlantı açmak yerine çağrıyı yapana döndürür. Uygulama bağlantıda çağrısında olduğunda, havuza alan kullanıcı bunu kapatmak yerine havuza alındı Close etkin bağlantılar kümesine döndürür. Bağlantı havuza döndürüldüktan sonra, sonraki çağrıda yeniden kullanılmaya Open hazırdır.

Yalnızca aynı yapılandırmaya sahip bağlantılar havuza alındı. ADO.NET aynı anda her yapılandırma için bir havuz tutar. Bağlantılar, bağlantı dizesine ve tümleşik güvenlik Windows kimlikle havuzlara ayrılır. Bağlantılar, bir işlemde listeli oluplarına göre de havuza alınan bağlantılardır. kullanırken, ChangePassword örnek bağlantı havuzunu SqlCredential etkiler. Kullanıcı kimliği ve parola aynı olsa bile farklı örnekleri SqlCredential farklı bağlantı havuzları kullanır.

Havuz bağlantıları, uygulamanın performansını ve ölçeklenebilirliğini önemli ölçüde geliştirebilir. Bağlantı havuzu varsayılan olarak ADO.NET. Siz açıkça devre dışı bırakmadıkça, havuza alan, uygulamanıza açıldık ve kapatıldıklarında bağlantıları iyiler. Ayrıca, bağlantı havuzu davranışını kontrol etmek için çeşitli bağlantı dizesi değiştiricileri de sebilirsiniz. Daha fazla bilgi için bu konunun devamlarında yer alan "Bağlantı Dizesi Anahtar Sözcükleriyle Bağlantı Havuzunu Denetleme" başlığına 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şur ve sonraki bağlantı girişimleri sonraki beş saniye boyunca başarısız olur( "engelleme süresi"). Uygulama engelleme süresi içinde bağlanmaya çalışırsa, ilk özel durum yeniden oluşturur. Bir engelleme süresi sona erdikten sonraki hatalar, yeni engelleme sürelerinin önceki engelleme süresine en fazla bir dakika kadar olan iki katı kadar yeni bir engelleme süresiyle neden olur.

Havuz Oluşturma ve Atama

Bir bağlantı ilk kez açıldığında, havuzu bağlantının bağlantı dizesiyle ilişkilendiren tam eşleme algoritmasına göre bir bağlantı havuzu oluşturulur. Her bağlantı havuzu ayrı bir bağlantı dizesiyle ilişkilendirildi. Yeni bir bağlantı açıldığında, bağlantı dizesi mevcut bir havuzla tam eşleşmezse 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ılırken her işlem için bir Windows kullanılır. Bağlantı dizeleri de tam eşleşmeli; aynı bağlantı için farklı bir sırada sağlanan anahtar sözcükler ayrı olarak havuza alınır.

Aşağıdaki C# örneğinde, üç SqlConnection yeni nesne oluşturulur, ancak bunları yönetmek için yalnızca iki bağlantı havuzu gereklidir. birinci ve ikinci bağlantı dizelerinin için atanan değere göre farklılık Initial Catalog gösterir.

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.  
    }  

Bağlantı MinPoolSize dizesinde belirtilmezse veya sıfır olarak belirtilirse, havuz bağlantıları bir süre sonra kapatılır. Ancak, belirtilen değer sıfırdan büyükse, bağlantı havuzu kaldırılana ve işlem MinPoolSize AppDomain sona erinceye kadar yok edilemez. 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şılanacak şekilde birden çok bağlantı nesnesi oluşturulur ve havuza eklenir. Bağlantılar, belirtilen en büyük havuz boyutuna kadar gerektiğinde havuza eklenir (varsayılan değer 100'tir). Bağlantılar kapatılan veya atılan havuza geri serbest bırakılmıştır.

Bir SqlConnection nesne istenebilir bir bağlantı varsa havuzdan elde edilir. Kullanılabilir olması için bağlantının kullanılmamış olması, eşleşen bir işlem bağlamına sahip olması veya herhangi bir işlem bağlamıyla ilişkilendirilmemiş olması ve geçerli bir sunucu bağlantısına sahip olması gerekir.

Bağlantı havuzu yöneticisi, yeniden havuza serbest bırakıldıklarından bağlantıları yeniden bularak bağlantı isteklerini karşılar. Maksimum havuz boyutuna ulaşıldı ve kullanılabilir bağlantı yoksa istek kuyruğa alındı. Ardından havuza alan, zaman sonuna ulaşana kadar tüm bağlantıları geri alır (varsayılan değer 15 saniyedir). Havuza alan, bağlantı zaman olmadan önce isteği karşılayamazsa bir özel durum ortaya çıkar.

Dikkat

Bağlantının havuza döndürülecek olması için, kullanmayı bitirdikten sonra bağlantıyı her zaman kapatmanızı kesinlikle öneririz. Bunu yapmak için nesnenin veya yöntemlerini kullanabilir veya C# içindeki bir deyiminin içindeki tüm bağlantıları veya bir deyimini Close Dispose Connection using Using Visual Basic. Açıkça kapatılan bağlantılar havuza eklenmez veya havuza döndürülene kadar olabilir. Daha fazla bilgi için bkz. using Deyimi veya How to: Dispose of a System Resource for Visual Basic.

Not

Sınıf Close yönteminde Dispose bir , veya başka bir yönetilen nesne üzerinde veya çağrısı Connection DataReader Finalize yapma. Sonlandırıcıda, yalnızca sınıfınıza doğrudan sahip olan, unmanaged resources serbest bırakın. Sınıfınız herhangi bir unmanaged kaynağına sahip yoksa, sınıf Finalize tanımınıza bir yöntem dahil değildir. Daha fazla bilgi için bkz. Çöp Toplama.

Bağlantıları açma ve kapatma ile ilişkili olaylar hakkında daha fazla bilgi için, SQL Server belgelerinde Oturum Açma Olay Sınıfını Denetleme ve Denetim Oturumu Kapatma Olay Sınıfı'SQL Server bakın.

Bağlantıları Kaldırma

Bağlantı havuzu başlatıcısı, yaklaşık 4-8 dakika boşta kaldıktan sonra veya havuza alan, sunucuyla bağlantının kesili olduğunu algılarsa, bağlantıyı havuzdan kaldırır. Kesikli bir bağlantının ancak sunucuyla iletişim kurmaya çalışıldıktan sonra algılana olduğunu unutmayın. Sunucuya bağlı kalmadan bağlantı bulunursa geçersiz olarak işaretlenir. Geçersiz bağlantılar bağlantı havuzundan yalnızca kapatıldıklarından veya geri alındıklarından kaldırılır.

Kaybolan bir sunucuyla bağlantı varsa, bağlantı havuza alan kişi bağlantıyı algılasa ve geçersiz olarak işaretlese bile bu bağlantı havuzdan çekilir. Bu durum, bağlantının hala geçerli olup olmadığını denetleme ek yükü nedeniyle sunucuya başka bir gidiş dönüş gerçekleşmesine neden olarak havuza bir havuza sahip olmak avantajlarını ortadan kaldırabilir. Bu durum oluştuğunda, bağlantıyı kullanmaya yapılan ilk deneme, bağlantının kesili olduğunu algılar ve bir özel durum oluşur.

Havuzu Temizleme

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

İşlem Desteği

Bağlantılar havuzdan çizilir ve işlem bağlamına göre atanır. Bağlantı Enlist=false dizesinde belirtilmedidiği sürece, bağlantı havuzu bağlantının bağlamda listelenenin emin Current olur. Bir bağlantı kapatılan ve listede yer alan bir işlemle havuza geri döndürülen bağlantı, aynı işlemle ilgili bir sonraki bağlantı havuzu isteğinin varsa aynı bağlantıyı geri getirecek şekilde bir kenara System.Transactions System.Transactions bırakılmıştır. Böyle bir istekte bulunuyorsa ve kullanılabilir havuza bağlantısı yoksa, havuzun işlem olmayan kısmından bir bağlantı çizilir ve listede yer alan bir bağlantı olur. Havuzun herhangi bir alanında kullanılabilir bağlantı yoksa, yeni bir bağlantı oluşturulur ve bu bağlantı listede yer almaktadır.

Bağlantı kapatılan bağlantı, işlem bağlamına göre havuza ve uygun alt bölüme geri serbest bırakılmıştır. Bu nedenle, dağıtılmış bir işlem beklemede olsa bile hata oluşturmadan bağlantıyı kapatabilirsiniz. Bu, dağıtılmış işlemi daha sonra işlemeye veya durdurmaya olanak sağlar.

Bağlantı Dizesi Anahtar Sözcükleriyle Bağlantı Havuzunu Denetleme

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

Havuz Parçalanması

Havuz parçalanması, uygulamanın işlem çıkana kadar serbest bırakılamayarak çok sayıda havuz oluşturaya kadar birçok Web uygulamasında yaygın olarak karşılaşılan bir sorundur. Bu, çok sayıda bağlantının açık ve bellek tüketerek düşük performansa neden olduğunu bırakır.

Tümleşik Güvenlik Nedeniyle Havuz Parçalanması

Bağlantılar, bağlantı dizesine ve kullanıcı kimliğine göre havuza alır. Bu nedenle, Web sitesinde Temel kimlik doğrulaması Windows kimlik doğrulaması ve tümleşik güvenlik oturum açma bilgileri kullanıyorsanız kullanıcı başına bir havuz elde edebilirsiniz. Bu, tek bir kullanıcı için sonraki veritabanı isteklerinin performansını iyilese de, bu kullanıcı diğer kullanıcılar tarafından yapılan bağlantılardan yararlanamaz. Ayrıca veritabanı sunucusuna kullanıcı başına en az bir bağlantıyla da sonuç verir. Bu, geliştiricilerin güvenlik ve denetim gereksinimlerine göre değerlendirmeleri gereken belirli bir Web uygulaması mimarisinin yan etkisidir.

Çok Sayıda Veritabanı Nedeniyle Havuz Parçalanması

Birçok İnternet hizmeti sağlayıcısı, tek bir sunucuda birkaç Web sitesi barındırmaktadır. Form kimlik doğrulaması oturum açma işlemini 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ı bağlantısı havuza alır ve herkes tarafından kullanılır. Ancak, her veritabanına ayrı bir bağlantı havuzu vardır ve bu da sunucuyla bağlantı sayısını artıracaktır.

Bu, uygulama tasarımının da yan etkisidir. Bu yan etkiyi önlemenin, ağ bağlantınıza bağlanarak güvenliği tehlikeye atmadan daha basit bir SQL Server. Her kullanıcı veya grup için ayrı bir veritabanına bağlanmak yerine sunucu üzerinde aynı veritabanına bağlanın ve transact-SQL USE deyimini yürütarak istenen veritabanına geçiş gerçekleştirin. Aşağıdaki kod parçası, veritabanına bir başlangıç bağlantısı oluşturmayı ve ardından master dize değişkensinde belirtilen istenen veritabanına databaseName geçmeyi gösterir.

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

Uygulama Rolleri ve Bağlantı Havuzu

Bir SQL Server uygulama rolü sistem saklı yordamı sp_setapprole çağrılarak etkinleştirildikten sonra, bu bağlantının güvenlik bağlamı sıfırlanmaz. Ancak, havuz etkinleştirilirse bağlantı havuza döndürülür ve havuza bağlantı yeniden kullanılırken bir hata oluşur. Daha fazla bilgi için " Bilgi Bankası havuzuyla SQL uygulama rolühataları" OLE DB makalesine bakın.

Uygulama Rolü Alternatifleri

Uygulama rolleri yerine kullanabileceğiniz güvenlik mekanizmalarını kullanmalarını öneririz. Daha fazla bilgi için bkz. SQL Server.

Ayrıca bkz.