Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa memecahkan masalah kumpulan koneksi antara ASP.NET dan SQL Server?

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 atau sp_who2 . Prosedur tersimpan sistem ini mengembalikan informasi dari sysprocesses 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menjalankan SQL Server 2014 di Mesin Virtual Azure

  2. Setara dengan MySQL PADA DUPLICATE KEY UPDATE di Sql Server

  3. Fungsi format tanggal SQL Server

  4. Belajar Menyimpan dan Menganalisis Dokumen di Sistem File Windows dengan Pencarian Semantik SQL Server – Bagian 1

  5. Bergabung dengan tabel berdasarkan nilai yang dipisahkan koma