Dalam kebanyakan kasus, masalah penyatuan koneksi terkait dengan "kebocoran koneksi." Aplikasi Anda mungkin tidak menutup koneksi basis datanya dengan benar dan konsisten. Ketika Anda membiarkan koneksi terbuka, mereka tetap diblokir sampai .NET sampah mengumpulkannya untuk Anda dengan memanggil Finalize()
metode mereka .
Anda ingin memastikan bahwa Anda benar - benar menutup koneksi . Misalnya kode berikut akan menyebabkan kebocoran koneksi, jika kode antara .Open
dan Close
melemparkan 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);
}
Ketika fungsi Anda mengembalikan koneksi dari metode kelas, pastikan Anda melakukan cache secara lokal dan memanggil Close
metode tersebut. Anda akan membocorkan koneksi menggunakan kode ini misalnya:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
Sambungan kembali dari panggilan pertama ke getConnection()
tidak ditutup. Alih-alih menutup koneksi Anda, baris ini membuat yang baru dan mencoba untuk menutupnya.
Jika Anda menggunakan SqlDataReader
atau OleDbDataReader
, tutuplah. Meskipun menutup koneksi itu sendiri tampaknya melakukan trik, lakukan upaya ekstra untuk menutup objek pembaca data Anda secara eksplisit saat Anda menggunakannya.
Artikel ini " Mengapa Connection Pool Overflow? " Dari MSDN / SQL Magazine menjelaskan banyak detail dan menyarankan beberapa strategi debugging:
- Jalankan
sp_who
atau sp_who2
. Prosedur yang disimpan sistem ini mengembalikan informasi dari sysprocesses
tabel sistem yang menunjukkan status dan informasi tentang semua proses kerja. Secara umum, Anda akan melihat satu ID proses server (SPID) per koneksi. Jika Anda menamai koneksi Anda dengan menggunakan argumen Nama Aplikasi dalam string koneksi, koneksi kerja Anda akan mudah ditemukan.
- Gunakan SQL Server Profiler dengan
TSQL_Replay
templat SQLProfiler 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 membahas metode ini sebentar lagi.
- Monitor 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.