2013-03-21 21 views
8

Bu soru için çelişen sonuçlar bulmaya devam ediyorum. en bir SQL sorgusu çalışan bu C# kodu bakalım:SQL Server bağlantısını kullanarak anahtar sözcüğünü kapatmam gerekiyor mu?

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    cn.Open(); 

    using (SqlCommand cmd = new SqlCommand(strSQL, cn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 

    //Do I need to call? 
    cn.Close(); 
} 

bu son cn.Close() çağırmak gerekir mi? Ben soruyorum nedeni yoğun trafikte bir web uygulamasında bir havuzda bağlantıları bitti.

cevap

10

burada kullanıldığı gibi using anahtar kelime: bu da hemen

SqlConnection cn = null; 
try 
{ 
    cn = new SqlConnection(strConnectString); 
    // Stuff 
} 
finally 
{ 
    if (cn != null) cn.Dispose(); 
} 

cn.Dispose() hemencn sonra denilen using kapsamı dışına gider edilecektir:

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

kısaltmasıdır bağlantıyı kapatır (SqlConnection.Dispose() yalnızca bunu yapar).

GÜNCELLEME

Bu çöp toplama ile karıştırılmamalıdır. GC, deterministik değildir.NET, tam olarak neden IDisposable inteface ve Dispose Pattern tanıtıldı. Kullanılabilir, pahalı kaynakların zamanında ve belirleyici bir şekilde yayınlanmasını sağlar.

1

Using ifadesini kullandığınızda bağlantıyı kapatmanız gerekmez.

Scott hanselman burada açıklar Why The Using Statement Is Better Than A Sharp Stick In The Eye And A SqlConnection Refactoring Example.

Yoğun trafikte bir web uygulamasında bir havuzda bağlantılardan kaldım.

SQL'in Bağlantı Havuzu'nu kullanacağı şekilde, aynı bağlantı dizesini kullandığınızdan emin olun.

bağlantısı hemen kapalı olan, ya da çöp toplayıcı buna alır kapalı olup

Düzenleme:

bertaraf model kaynaklarının deterministik imha sağlamak için kullanılır. .net çalışma zamanı çöp toplayıcısını deterministik olmadığı için (bu, çalışma zamanı eski nesneleri toplayacağından ve sonleştiricilerini arayacağından emin olamayacağınız anlamına gelir). Bu nedenle, Dispose desenini düzgün bir şekilde uyguladığınızda, kaynakların belirleyici bir şekilde salınmasını sağlarsınız ve tüketicinin dikkatsiz olduğu ve nesneyi atmadığı durumlarda, sonlandırıcı nesneyi temizler.

+0

Teşekkürler. Soru şu: - Bağlantı derhal kapatıldı mı, yoksa çöp toplayıcısı ona ulaştığında kapanıyor mu? Çünkü bu benim durumumda bir fark yaratıyor. – c00000fd

+0

"Aynı bağlantı dizesini kullandığınızdan emin olun" - Bununla ne demek istiyorsun? SqlConnection cn'yi statik değişken olarak tanımlayın. – c00000fd

+1

'Bu deterministik olmayan finalizasyon' = ** yanlış **. Bağlantı, * using 'ifadesinin kapsamı dışına çıktıktan hemen sonra * atılır *. Bunun çöp toplama ile ilgisi yok. Aslında, deterministik olmayan GC, IDisposable arayüzü ve Dispose Pattern'in neden .NET'e sunulduğunun tam olarak nedenidir. –

1

using numaralı telefonu kullanıyorsa, kapatmak için gerekli değildir Displose() dahili olarak.

ADO.NET'de using anahtar kelimesi ile ilgili bazı ayrıntılar, okunmaya değer olabilir.

Leveraging the "using" keyword in C#

bir hızlı arama @SO çok orada cevap bulabilirsiniz this post, götürecektir.

İlgili konular