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.

fobiksozluk.com‘da karşılaştığım önemli problemlerden birisi de buydu. Bu projede kullandığım bir hata ayıklama sistemi ile hataları hem event log’a hem de fiziksel bir dosyaya yazıyordum ve daha sonra bu logları incelediğimde,

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

hataları görüyodum çokça. Sorunun çözümüne ilişkin bulduğum verileri sizlerle de paylaşmak istiyorum. Eminim bir çoğunuz bu sorunla karşılaşmışsınızdır. En azından bu yazıyı okuyor olmanız bu sorunu yaşadığınızı gösterir dimi 🙂

Şimdi efenim öncelikle sorunun neden(ler)i nedir ona bir göz atalım. Bu soruna genellikle kod içerisinde açılan ancak kapatılması unutulan (ya da kapatılması kontrol edilmeyen) Connection’lar neden olur. Bu kapatılmayan Connection’lar ise Connection Pool içerisinde tanımlı max. Connection sayısına ulaştığında sistem her yeni Connection açmaya çalıştığında bu hatayı alırsınız (Ortaya çıkan bu duruma da Connection Leak adı verilir). Örnek vermek gerekirse,

SqlConnection conn = new SqlConnection(myConnectionString);
conn.Open();
biSeylerYap();
conn.Close();

Eğer biSeylerYap() metodu bir hata üretirse açılan Connection kapanmayacaktır. Bu durumu da şu şekilde düzeltemek mümkündür:

SqlConnection conn = new SqlConnection(myConnectionString);
try
{
conn.Open();
biSeylerYap(conn);
}
finally
{
conn.Close();
}

dolayısıyla kodunuzun içerisinde Connection Leak oluşturabilecek durumlardan kaçınmanız gerekir.

Sonuç olarak bu hatayı ortadan kaldırmak için aşağıdaki önlemleri almanızı öneriyorum.

1. Kodunuzun içerisinde veri tabanınıza açtığınız her bağlantının uygun bir şekilde kapatıldığından emin olun. ASP.NET kullanılmayan kaynakları temizleyen bir yapıya zaten sahiptir (garbage collector). Ancak çok yoğun bir sitede Connection Pool içerisindeki bağlantıların garbage collector onları temizlemeden önce tükenmesi çok muhtemeldir.

2. Connection Pool boyutunu arttırabilirsiniz. Connection Pool boyutu connection string içerisinde tanımlanır. Örneğin Connection String içerisine “Max Pool Size=100” ifadesini eklediğinizde Connection Pool boyutunu 100’e çıkartmış olursunuz.

hadi bakalım…

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

, , , , ,

No comments yet.

Bir Cevap Yazın

Font Resize