2011-07-06 22 views
10

.NET kullanarak yazdığım kodda bir sorunum var.Bağlantı havuzumdaki bağlantıların ne olduğunu nasıl bulurum?

Sorun bir süre sonra aşağıdaki hatayı alıyorum demektir bazı tehlikeli veritabanı koduna sahip bir yerde olmasıdır:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

yere ben birinin bertaraf değil çünkü olduğunu biliyoruz benim veri okuyucuları veya benzer bir şey var, yani hala bağlantı açık olduğu için havuza geri gönderilmiyor. Bu benim kodumda bunun olmasına rağmen, bir miktar sorun yaşıyorum.

Benim soru:

onun kullanım bağlantıları ne yaptığını öğrenmek için bağlantı havuzu sorgulamak için herhangi bir yolu var mı. Sorgulanan kod parçasını bulmama izin vermek için hangi sorgunun çalıştırıldığını bulmanın bir yolunu arıyorum.

Değeri için, söz konusu veritabanında bu yolu bulmak için bir etkinlik izleyicisi çalıştırmak için izinlerim yok.

+0

Çerçevenin hangi sürümünü kullanıyorsunuz? –

+0

@Conrad: Sürüm 2.0 – Chris

cevap

12

Is there any way to query the connection pool to find out what its in use connections are doing.

Hayır. Gerçekten değil. Bağlantı havuzu, uygulamanızın sahip olduğu bir şeydir (aslında bir List<DbConnectionInternal>) Eğer gerçekten isterseniz havuzdaki bağlantılara yansıma yoluyla ulaşabilir veya hata ayıklama işlemi yapıyorsanız, yerel veya izleme penceresinden (aşağıya bakın) ancak Oradaki bağlantıdan ne olduğuna veya hangi nesnenin Connection.Close (veya Dispose) olarak adlandırıldığına bakalım. size toplanmış bağlantıların tükendi zaman aşımını almak anda sp_who veya Sp_who2 yürütebileceği şanslıysak Böylece

enter image description here

yardımcı olmuyor zaman ancak onun büyük olasılıkla çoğu o Sonuçlar böyle görünecek.

SPID Staus Login Hostname Blkby DBname Command   .... 
---- ------- ----- --------- ----- ------ ---------------- 
79 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
80 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
81 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
82 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 

Bu, evet uygulamanızın çok fazla bağlantı açtığını ve kapatılmadığını ve hatta onlarla hiçbir şey yapmadığını anlamına gelir.

Bu sorunu çözmenin en iyi yolu, uygulamanızı ADO.NET Performance Counters numaralı telefonu kullanarak izlemek ve NumberOfReclaimedConnections numaralı telefona yakından bakmak ve ayrıca kapsamlı bir kod incelemesi yapmaktır.

Gerçekten çaresiz iseniz, bu sorunla karşılaştığınızda havuzu temizleyebilirsiniz.

using (SqlConnection cnn = new SqlConnection("YourCnnString")) 
{ 

    try 
    { 
      cnn.Open(); 
    } 
    catch (InvalidOperationException) 
    { 
      SqlConnection.ClearPool(cnn); 
    } 
    cnn.Open(); 

} 

o sadece kaynakların dolmadan sunucu sağlayacak gibi uygulama gibi birçok bağlantıları açmak için izin verir, çünkü bu sizin sunucusunun DB boğulma potansiyele sahiptir çünkü ancak bu karşı dikkatli yoktur.

+0

Teşekkürler Conrad. Oldukça kapsamlı bir cevap gibi görünüyor ve şüphelendiğim şeyi söyledim. Sonuçta veritabanına erişimin tamamen yazılıma ve tamamen elden geçirilmesine kadar olan yoldan mutsuz olduğuna karar verdim. Bu özellikle, izleme penceresindeki bağlantı havuzunu nasıl bulacağınıza dair işaretçilerdir. :) – Chris

2

İlgili veritabanına SSMS yüklemeyi ve sp_who2 çalıştırmayı denediniz mi?

USE [SomeDatabase] 
EXEC sp_who2 

Bu, size bir anda neler olduğunu göstermelidir.

+0

Sadece denedim (yazım hatası düzeltmek istiyorsanız sp_who2), ancak sadece geçerli bağlantımı döndürdü.Bağlantımı değiştirmeyi, söz konusu kodla aynı bağlantı ayarlarını kullanacak şekilde değiştirmeyi denedim, ancak yine de yalnızca tek satırın geçerli bağlantım olduğu görülüyordu. Bunun, aktivite monitörünü çalıştırmamı durduran aynı izin sorunu olduğunu varsayalım. :(Öneriniz için teşekkürler. – Chris

İlgili konular