SORU
22 Mart 2009, Pazar


Nasıl ASP.NET ve SQL Server arasında bağlantı havuzu bir sorunu çözebilir miyim?

Son bir kaç gündür web sitemizde bu hata mesajı çok fazla görüyoruz:

"Zaman aşımı süresi doldu. Zaman aşımı süresi önce bir almak için geçen havuzdan bağlantı. Bu olabilir tüm havuza nedeniyle oluşmuş bağlantıları kullanmak ve en büyük havuz vardı büyüklüğe ulaştı."

Bir süredir bizim kod içinde değişen bir şey var. Kodu kapatmamış olan bağlantıları kontrol açmak için yeniledim, ama her şey yolunda bulundu.

  • Bunu nasıl çözebilirim?

  • Bu havuzu düzenlemek gerek var mı?

  • Nasıl bağlantı bu havuz Max'in numarasını değiştirebilir miyim?

  • Yüksek trafik web sitesi için önerilen değeri nedir?

< / ^ hr .

Güncelleme:

IIS bir düzenleme gerekiyor mu?

Güncelleme:

Bulduğum sayının etkin bağlantıları olan herhangi bir yerden 15, 31, ve bulduğum max izin verilen bağlantı sayısı yapılandırılmış SQL server daha fazla 3200 bağlantıları, 31 çok fazla, yoksa ben Düzenle bir şey ASP.NET yapıları?

CEVAP
22 Mart 2009, Pazar


Çoğu bağlantı sorunları havuzu "bağlantı sızdırıyor." ile ilgilidir Uygulamanız muhtemelen veritabanı bağlantılarının doğru ve tutarlı bir şekilde yakın değil. Bağlantıları açık bıraktığında, bu kadar bloke kalır .NET çöp toplayıcısını Finalize() kendi yöntemini çağırarak onları kapatır.

Olduğunuzdan emin olungerçekten bağlantısı kapatılıyor. Örneğin aşağıdaki kodu .Open Close arasında kod bir özel durum oluşturursa bağlantı sızıntısına neden olacak

SqlConnection myConnection = new SqlConnection(ConnectionString);
myConnection.Open();
// some code
myConnection.Close();                

Doğru yol bu olacaktır:

SqlConnection myConnection = new SqlConnection(ConnectionString);
try
{
     conn.Open();
     someCall (myConnection);
}
finally
{
     myConnection.Close();                
}

ya

using (SqlConnection myConnection = new SqlConnection(ConnectionString))
{
     myConnection.Open();
     someCall(myConnection);
}

Fonksiyon zamandöndürür bir sınıf yöntemi bir bağlantıbunu yerel olarak önbelleğe ve Close yöntem aramak emin olun. Bağlantı örneğin: bu kodu kullanarak sızıntısı

myCommand = new OleDbCommand(SomeUpdateQuery, getConnection());
result = myCommand.ExecuteNonQuery();
myConnection().Close(); 

Bağlantı getConnection() İlk Çağrı tarafından döndürülen kapatılmıyor. Bağlantınızı kapatmak yerine, bu satır, yeni bir tane oluşturur ve bunu kapatmak için çalışır.

Eğer SqlDataReader veya bir OleDbDataReader kullanırsanız, onları kapatın. Hile yapmak için kendisi gibi bağlantısı kapatılıyor olsa bile, onları kullandığınızda veri okuyucu nesneleri açıkça kapatmak için ekstra çaba koymak.


Bu makalede, "" SQL Dergisi detayları açıklıyor ve bazı hata ayıklama stratejileri öneriyor MSDN/:. Why Does a Connection Pool Overflow?

  • sp_who sp_who2 çalıştırın. Bu sistem saklı yordamları durumunu gösterir sysprocesses sistem tablosundan bilgi dönmek ve tüm çalışma süreçleri hakkında bilgi. Genellikle, bir sunucu başına bağlantı KİMLİĞİ (SPİD) işlem göreceksiniz. Eğer bağlantı dizesini Uygulama Adı bağımsız değişkeni kullanarak bağlantınızı adlı çalışma bağlantıları bulmak kolay olacak.
  • TSQL_Replay açık bağlantı izleme için şablon SQLProfiler ile SQL Server Profiler kullanın. Eğer Profiler aşina iseniz, bu yöntem sp_who kullanarak yoklama daha kolaydır.
  • Performans İzleyicisi havuzları ve bağlantıları izlemek için kullanın. Ben bir anda bu yöntemi tartışmak.
  • Kod performans izleyicisi sayaçları. Yeni rutinleri kullanarak sayaçları ayıklamak için kullanarak veya bağlantı havuzu sağlığı ve kurulan bağlantı sayısını izleyebilirsiniz .NET PerformanceCounter kontrol eder.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • George McCarron

    George McCar

    29 Mayıs 2013
  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011