1) Có, tôi coi nó là đáng tin cậy vì nó thực hiện đúng mục đích được thiết kế để làm (vô hiệu bộ nhớ cache)
2) Không. Đây là lý do tại sao bạn chỉ có thể đăng ký bằng cách đưa ra một truy vấn, điều này đảm bảo rằng không có cuộc chạy đua nào giữa việc tìm nạp dữ liệu và thông báo cập nhật mới
3) Khởi động lại cơ sở dữ liệu (hoặc phiên bản) báo hiệu tất cả các thông báo truy vấn đang chờ xử lý bằng SqlNotificationInfo
giá trị của Restart
. Đọc cách SqlDependency và dựa trên Thông báo truy vấn
để hiểu rõ hơn. Dưới dạng SqlDependency
giữ kết nối mở với cơ sở dữ liệu mọi lúc, một cơ sở dữ liệu không khả dụng sẽ được phát hiện bởi SqlDependency
ngay cả trước bất kỳ thông báo truy vấn rõ ràng nào
4) Không. Tìm hiểu thêm về vấn đề này ...
5) Không có 'dữ liệu bị bỏ lỡ'. Thông báo truy vấn (và do đó SqlDependency) không bao giờ thông báo cho bạn về cái gì dữ liệu đã thay đổi. Nó chỉ thông báo cho bạn rằng nó đã thay đổi . Bạn luôn phải quay lại và đọc tất cả dữ liệu trở lại cho thấy những gì đã thay đổi (và tôi giới thiệu bạn trở lại câu hỏi / câu trả lời số 2). Một ứng dụng mới bắt đầu chưa truy vấn dữ liệu bắt đầu, vì vậy không có thay đổi nào cần được thông báo. Chỉ sau nó đã truy vấn dữ liệu trước thì nó có thể nhận được thông báo không.
Từ mô tả vấn đề của bạn, tôi không tin rằng bạn cần thông báo truy vấn. Đối với tôi, dường như bạn muốn thực hiện bất kỳ thay đổi nào, không quan trọng thời điểm nó xảy ra, ngay cả khi ứng dụng của bạn không chạy . Đây chắc chắn không phải là vô hiệu bộ nhớ cache, nó là theo dõi thay đổi. Do đó, bạn cần triển khai công nghệ theo dõi thay đổi, như Thay đổi thu thập dữ liệu hoặc Theo dõi Thay đổi , cả hai đều chỉ là SQL Server 2008 trở lên (không khả dụng trong SQL Server 2005). Với SQL Server 2005, không có gì lạ khi triển khai một trình kích hoạt và xếp hàng một thông báo cho Nhà môi giới dịch vụ để xử lý cùng một vấn đề mà bạn đang cố gắng xử lý (phát hiện các thay đổi, phản ứng với từng hàng dữ liệu mới).