Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để xóa SqlDependency khỏi bộ nhớ SQL Server?

Có một hành vi cụ thể của lớp Microsoft SqlDependency. Ngay cả khi bạn gọi phương thức SqlDependency.Stop (), hãy phát hành SqlCommand và SqlConnection - nó vẫn giữ các nhóm hội thoại (sys.conversation_groups) và điểm cuối hội thoại (sys.conversation_endpoints) trong cơ sở dữ liệu. Có vẻ như SQL Server tải mọi điểm cuối hội thoại và sử dụng tất cả bộ nhớ được phép. Tại đây các bài kiểm tra chứng minh điều đó. Vì vậy, để làm sạch tất cả các điểm cuối hội thoại không sử dụng và giải phóng tất cả bộ nhớ bị chiếm dụng, bạn phải bắt đầu mã SQL này cho cơ sở dữ liệu của mình:

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;

Ngoài ra, SqlDependency không cho bạn cơ hội nhận TẤT CẢ các thay đổi của bảng. Vì vậy, bạn không nhận được thông báo về những thay đổi trong quá trình đăng ký lại SqlDependency.

Để tránh tất cả những vấn đề này, tôi đã sử dụng một mã nguồn mở khác của lớp SqlDependency - SqlDependencyEx . Nó sử dụng trình kích hoạt cơ sở dữ liệu và thông báo Service Broker gốc để nhận các sự kiện về các thay đổi của bảng. Đây là một ví dụ sử dụng:

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);

Hy vọng điều này sẽ hữu ích.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xác định vị trí công việc tác nhân máy chủ SQL trong Azure Data Studio

  2. So sánh các cột trong đó một cột tương tự với một phần của cột khác

  3. Chức năng tích hợp để viết hoa chữ cái đầu tiên của mỗi từ

  4. TSQL Shred XML - Làm việc với không gian tên

  5. Bảng tổng hợp và các cột nối