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

Bagaimana cara membersihkan SqlDependency dari memori SQL Server?

Ada perilaku khusus kelas Microsoft SqlDependency. Meskipun Anda memanggil metode SqlDependency.Stop() , lepaskan SqlCommand dan SqlConnection - metode ini masih menyimpan grup percakapan (sys.conversation_groups) dan titik akhir percakapan (sys.conversation_endpoints) dalam database. Sepertinya SQL Server memuat setiap titik akhir percakapan dan menggunakan semua memori yang diizinkan. Di sini tes yang membuktikannya. Jadi, untuk membersihkan semua titik akhir percakapan yang tidak digunakan dan melepaskan semua memori yang terisi, Anda harus memulai kode SQL ini untuk database Anda:

DECLARE @ConvHandle uniqueidentifier
DECLARE Conv CURSOR FOR
SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP
WHERE CEP.state = 'DI' or CEP.state = 'CD'
OPEN Conv;
FETCH NEXT FROM Conv INTO @ConvHandle;
WHILE (@@FETCH_STATUS = 0) BEGIN
    END CONVERSATION @ConvHandle WITH CLEANUP;
    FETCH NEXT FROM Conv INTO @ConvHandle;
END
CLOSE Conv;
DEALLOCATE Conv;

Juga, SqlDependency tidak memberi Anda kesempatan untuk menerima SEMUA perubahan tabel. Jadi, Anda tidak menerima pemberitahuan tentang perubahan selama berlangganan ulang SqlDependency.

Untuk menghindari semua masalah ini, saya menggunakan realisasi open source lain dari kelas SqlDependency - SqlDependencyEx . Ini menggunakan pemicu database dan pemberitahuan Pialang Layanan asli untuk menerima peristiwa tentang perubahan tabel. Ini adalah contoh penggunaan:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

Semoga membantu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server datetime SEPERTI pilih?

  2. Permintaan ODBC pada MS SQL Server mengembalikan 255 karakter pertama hanya dalam PHP PDO (FreeTDS)

  3. Cara Memperbaiki "Nama objek tidak valid 'OPENJSON'." di SQL Server

  4. Apa pentingnya 1/1/1753 di SQL Server?

  5. SQL Server v.Berikutnya :Performa STRING_AGG()