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: .NET Framework
.NET
.NET Standard
Bir veritabanı sunucusuna bağlanmak genellikle zaman alan birkaç adımdan oluşur. Fiziksel bir kanal olarak bir soket veya adlandırılmış bir boru kurulmalıdır, sunucuyla ilk el sıkışma gerçekleşmelidir, bağlantı dizesi bilgileri ayrıştırılmalıdır, bağlantının sunucu tarafından kimlik doğrulaması yapılmalıdır, geçerli işleme katılmak için denetimler çalıştırı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. Bağlantıları açma maliyetini en aza indirmek için, SQL Server için Microsoft SqlClient Veri Sağlayıcısı 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.
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. Kullanıcı, bir bağlantıyı çağırdığında Open, 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 döndürür. Uygulama bağlantıyı çağırdığında Close, bağlantı havuzlayıcı bunu kapatmak yerine havuzlanmış 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. SQL Server için Microsoft SqlClient Veri Sağlayıcısı, her yapılandırma için bir tane olmak üzere birkaç havuzu aynı anda tutar. Bağlantılar, bağlantı dizesine 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. Varsayılan olarak, bağlantı havuzu SQL Server için Microsoft SqlClient Veri Sağlayıcısı'nda etkinleştirilir. Açıkça devre dışı bırakmadığınız sürece, bağlantı havuzlayıcı, uygulamanızda bağlantılar açılır ve kapatılı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 bulunan "Bağlantı Dizesi Anahtar Sözcükleriyle Bağlantı Havuzunu Denetleme" konusuna bakın.
Önemli
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ı girişimleri sonraki 5 saniye boyunca başarısız olur, "blocking period". 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, önceki engelleme süresinden iki kat daha uzun ve en fazla 1 dakikaya kadar yeni bir engelleme süresine neden olur.
Uyarı
"blocking period" mekanizması varsayılan olarak Azure SQL Server için geçerli değildir. .PoolBlockingPeriod dışında özelliği ConnectionString değiştirilerek bu davranış değiştirilebilir.
Havuz oluşturma ve atama
Bir bağlantı ilk açıldığında, havuzu bağlantıdaki bağlantı dizesiyle ilişkilendiren tam olarak eşleşen bir algoritma temelinde bir bağlantı havuzu oluşturulur. Her bağlantı havuzu ayrı bir bağlantı dizesiyle ilişkilendirilir. Yeni bir bağlantı açıldığında, bağlantı dizesi var olan bir havuzla tam olarak eşleşmezse yeni bir havuz oluşturulur.
Uyarı
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ği başına 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.
Uyarı
Bağlantı dizesinde MinPoolSize belirtilmezse veya sıfırsa, havuzdaki bağlantılar hareketsizlik süresi sonunda kapatılır. Ancak, belirtilen MinPoolSize sıfırdan büyükse, işlem sona erene ve AppDomain kaldırılana kadar bağlantı havuzu yok edilmez. Etkin olmayan veya boş havuzların bakımı minimum sistem yükü gerektirir.
Uyarı
Ciddi bir hata oluştuğunda, örneğin bir yük devretme işlemi sırasında, havuz otomatik olarak temizlenir.
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ı dizelerinin için Initial Catalogatanan değere göre farklılık gösterdiğini unutmayın.
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ı 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 imha edildiğinde havuza geri iade edilir.
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 yöneticisi, yeniden havuza gönderilen bağlantıları yeniden tahsis ederek 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 yöneticisi, bağlantı zaman aşımına uğramadan isteği karşılayamazsa, bir istisna fırlatılır.
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. Deyimi kullanma veya Nasıl yapılır: Visual Basic için Sistem Kaynağını Atma .
Uyarı
sınıfınızın Finalize yönteminde, bir Dispose, 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
LoadBalanceTimeout (veya Connection Lifetime) ayarlanırsa, havuza bir bağlantı döndürülürse, oluşturma zamanı geçerli saatle karşılaştırılır ve bu zaman aralığı (saniye cinsinden) tarafından LoadBalanceTimeoutbelirtilen değeri aşarsa bağlantı yok edilir. Bu, kümelenmiş yapılandırmalarda çalışan bir sunucu ile yeni çevrimiçi duruma getirilmiş bir sunucu arasında yük dengelemeye zorlamak için kullanışlıdır.
LoadBalanceTimeout (veya Bağlantı Ömrü) ayarlanmamışsa (varsayılan değer = 0), bağlantı havuzu oluşturucu yaklaşık 4-8 dakika boşta kaldığında (rastgele iki geçişli bir şekilde) veya havuz oluşturucu sunucuyla bağlantının kesildiğini algılarsa bağlantıyı havuzdan kaldırır.
Uyarı
Kopmuş bir bağlantı yalnızca sunucuyla iletişim kurmaya çalışıldıktan sonra algılanabilir. 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 yöneticisi kesilmiş 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
SQL Server için Microsoft SqlClient Veri Sağlayıcısı, 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.
Uyarı
Ç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ına göre atanır. Bağlantı dizesinde `Enlist=false` belirtilmediği sürece, bağlantı havuzu bağlantının `Current` bağlamda yer aldığından 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ükleriyle bağlantı havuzunu denetleme
ConnectionString nesnesinin SqlConnection özelliği, bağlantı havuzu mantığının 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ı dizesine 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 entegre bir güvenlik giriş sistemi kullanıyorsanız, kullanıcı başına bir bağlantı havuzu 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 olan bağlantı havuzlanı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 istenen veritabanına geçmek için Transact-SQL USE deyimini yürütür.
Aşağıdaki kod parçası, veritabanına başlangıç bağlantısını master oluşturmayı ve ardından dize değişkeninde belirtilen hedef veritabanına databaseName geçmeyi gösterir.
// Assume that connectionString connects to master.
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand())
{
connection.Open();
command.Connection = connection;
command.CommandText = "USE DatabaseName";
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ı sıfırlanamaz. Havuzlama etkinse, bağlantı havuza geri döner ve havuzdaki bağlantı yeniden kullanıldığında bir hata oluşur.
Uygulama rolü alternatifleri
Uygulama rolleri yerine kullanabileceğiniz güvenlik mekanizmalarından yararlanmanızı öneririz.
Ayrıca bakınız
- Bağlantı havuzu oluşturma
- SQL Server ve ADO.NET
- SqlClient'da tanılama sayaçları
- SQL Server için Microsoft ADO.NET