Çoğu durumda bağlantı havuzu oluşturma sorunları "bağlantı sızıntıları" ile ilgilidir. Uygulamanız muhtemelen veritabanı bağlantılarını doğru ve tutarlı bir şekilde kapatmıyor. Bağlantıları açık bıraktığınızda, .NET çöp toplayıcısı Finalize()
yöntemlerini çağırarak bunları kapatana kadar engellenmiş kalırlar .
Bağlantıyı gerçekten kapattığınızdan emin olmak istiyorsunuz . Arasındaki kod Örneğin aşağıdaki kod, bir bağlantı sızıntısına neden olur .Open
ve Close
bir istisna atar:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Doğru yol şu olurdu:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
veya
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
İşleviniz bir sınıf yönteminden bağlantı döndürdüğünde, yerel olarak önbelleğe aldığınızdan ve Close
yöntemini çağırdığınızdan emin olun . Bu kodu kullanarak bir bağlantıya sızacaksınız, örneğin:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
İlk çağrıdan geri dönen bağlantı getConnection()
kapatılmıyor. Bağlantınızı kapatmak yerine, bu hat yeni bir hat oluşturur ve kapatmaya çalışır.
Eğer kullanırsanız SqlDataReader
veya OleDbDataReader
onları kapatın. Bağlantının kendisinin kapatılması hile yapıyor gibi görünse de, veri okuyucu nesnelerinizi kullandığınızda açıkça kapatmak için ekstra çaba sarf edin.
MSDN / SQL Magazine'den " Bağlantı Havuzu Neden Taşıyor? " Başlıklı bu makalede çok sayıda ayrıntı açıklanmakta ve bazı hata ayıklama stratejileri önerilmektedir:
- Run
sp_who
veya sp_who2
. Bu sistem saklı yordamları, sysprocesses
sistem tablosundan tüm çalışma süreçlerinin durumunu ve bu bilgileri gösteren bilgileri döndürür . Genellikle, bağlantı başına bir sunucu işlem kimliği (SPID) görürsünüz. Bağlantınızı bağlantı dizesindeki Uygulama Adı bağımsız değişkenini kullanarak adlandırdıysanız, çalışan bağlantılarınızın bulunması kolay olacaktır.
TSQL_Replay
Açık bağlantıları izlemek için SQLProfiler şablonu ile SQL Server Profiler kullanın . Profiler'ı biliyorsanız, bu yöntem sp_who kullanarak yoklamaktan daha kolaydır.
- Havuzları ve bağlantıları izlemek için Performans İzleyicisi'ni kullanın. Bu yöntemi bir anda tartışıyorum.
- Koddaki performans sayaçlarını izleyin. Sayaçları ayıklamak için yordamlar kullanarak veya yeni .NET PerformanceCounter denetimlerini kullanarak bağlantı havuzunuzun sağlığını ve kurulan bağlantı sayısını izleyebilirsiniz.