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
Ç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österirsysprocesses
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.
Nasıl SQL Server belirli bir tabloya b...
Nasıl bir bağlantı noktası Windows ser...
nasıl sql server en iyi 100 kayıtları ...
Nasıl çizgiler iki gıt işleyen arasınd...
Nasıl denetleyicileri arasında değişke...