17

Tôi đã phát triển ứng dụng này trên VB.net 2010SQL 2008.
Tôi muốn khách hàng được thông báo về các cập nhật trên db và ứng dụng được sử dụng để kiểm tra db cho các thay đổi trong phút được chỉ định bằng bộ hẹn giờ, điều này thực sự không hiệu quả. Tôi đọc về query notification, sqldependency, service broker, nhưng sau đó tôi đọc nội dung nào đó có thể không hiệu quả nếu tôi có 100 khách hàng và tôi đang sử dụng thông báo truy vấn để đẩy thông báo đến ứng dụng của mình.
Ai đó có thể giúp tôi về những gì tôi nên làm và cách tôi có thể làm điều đó (sẽ thực sự hữu ích nếu có các ví dụ). Cảm ơn trước!Tôi muốn cơ sở dữ liệu của tôi (SQL) thông báo hoặc đẩy cập nhật cho ứng dụng của khách hàng

Trả lời

16

Thông báo truy vấn sẽ đẩy tới dịch vụ Nhà môi giới dịch vụ chứ không phải trực tiếp đến đơn đăng ký của bạn. Xem The Mysterious Notification để hiểu cách hoạt động. Ứng dụng của bạn đang chờ thông báo bằng cách đăng một tuyên bố WAITFOR(RECEIVE)trên cơ sở dữ liệu. Điều này ngụ ý rằng mỗi 100 máy khách đang chiếm một chuỗi công nhân SQL Server (có giới hạn, xem tùy chọn max worker threads). Tôi đã nhìn thấy điều này làm việc trong sản xuất với 1.000 khách hàng (sau khi bumping lên tùy chọn chủ đề công nhân tối đa) nhưng tôi sẽ tư vấn cho chống lại nó.

Đề xuất của tôi sẽ là có một giám sát dịch vụ để thay đổi, sử dụng SqlDependency/QueryNotifications. Dịch vụ này sau đó sẽ đẩy thông báo, sử dụng WCF ví dụ, cho tất cả các ứng dụng đang chạy của bạn. Bạn sẽ đăng ký các thay đổi chung (the table Foo was changed), chứ không phải các thay đổi cụ thể (the row x in table Foo was inserted).

Như một quy tắc chung SqlDependency/Query Notifications chỉ có thể thông báo cho bạn rằng dữ liệu đã thay đổi, nhưng nó sẽ không đẩy dữ liệu mới mới. Ứng dụng phải làm mới bộ dữ liệu cục bộ của nó bằng cách chạy lại các truy vấn, sau khi được thông báo.

3

Hãy cẩn thận khi sử dụng lớp SqlDependency - nó có problems với rò rỉ bộ nhớ. Hovewer, bạn có thể sử dụng việc thực hiện mã nguồn mở của lớp SqlDependency - SqlDependencyEx. Nó sử dụng một trình kích hoạt cơ sở dữ liệu và thông báo môi giới dịch vụ 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); 

Với SqlDependecyEx bạn có thể theo dõi chỉ UPDATE, DELETE tránh và INSERT. Hi vọng điêu nay co ich.

Các vấn đề liên quan