Dalam kebanyakan kasus, masalah penyatuan koneksi terkait dengan kebocoran koneksi . Aplikasi Anda mungkin tidak menutup koneksi databasenya dengan benar dan konsisten. Saat Anda membiarkan koneksi terbuka, koneksi tetap diblokir hingga pengumpul sampah .NET menutupnya untuk Anda dengan memanggil Finalize()
mereka metode.
Anda ingin memastikan bahwa Anda benar-benar menutup koneksi . Misalnya kode berikut akan menyebabkan kebocoran koneksi, jika kode antara .Open
dan Close
melempar pengecualian:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
Cara yang benar adalah ini:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
atau
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
Saat fungsi Anda mengembalikan koneksi dari metode kelas pastikan Anda menyimpannya secara lokal dan memanggilnya Close
metode. Anda akan membocorkan koneksi menggunakan kode ini misalnya:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Koneksi dikembalikan dari panggilan pertama ke getConnection()
tidak sedang ditutup. Alih-alih menutup koneksi Anda, baris ini membuat yang baru dan mencoba untuk menutupnya.
Jika Anda menggunakan SqlDataReader
atau OleDbDataReader
, tutup mereka. Meskipun menutup koneksi itu sendiri tampaknya berhasil, lakukan upaya ekstra untuk menutup objek pembaca data Anda secara eksplisit saat Anda menggunakannya.
Artikel ini "Mengapa Pool Koneksi Meluap?" dari MSDN/SQL Magazine menjelaskan banyak detail dan menyarankan beberapa strategi debugging:
- Jalankan
sp_who
atausp_who2
. Prosedur tersimpan sistem ini mengembalikan informasi darisysprocesses
tabel sistem yang menunjukkan status dan informasi tentang semua proses kerja. Umumnya, Anda akan melihat satu ID proses server (SPID) per koneksi. Jika Anda menamai koneksi Anda dengan menggunakan argumen Nama Aplikasi di string koneksi, koneksi kerja Anda akan mudah ditemukan. - Gunakan SQL Server Profiler dengan SQLProfiler
TSQL_Replay
template untuk melacak koneksi terbuka. Jika Anda terbiasa dengan Profiler, metode ini lebih mudah daripada polling dengan menggunakan sp_who. - Gunakan Monitor Kinerja untuk memantau kumpulan dan koneksi. Saya akan membahas metode ini sebentar lagi.
- Pantau penghitung kinerja dalam kode. Anda dapat memantau kesehatan kumpulan koneksi Anda dan jumlah koneksi yang dibuat dengan menggunakan rutinitas untuk mengekstrak penghitung atau dengan menggunakan kontrol .NET PerformanceCounter baru.