17

Ich entwickelte diese Anwendung unter VB.net 2010 und SQL 2008.
Ich wollte, dass die Clients für Updates auf der db benachrichtigt werden, und die Anwendung verwendet, um die db für Änderungen in der angegebenen Minute mit einem Timer zu überprüfen, die wirklich nicht effizient ist. Ich lese über query notification, sqldependency, service broker, aber dann habe ich gelesen, dass sie möglicherweise nicht effizient sein, wenn ich 100 Clients habe und ich benutze Abfragebenachrichtigungen, um Benachrichtigungen an meine Anwendung zu senden.
Würde jemand helfen, was ich tun soll, und wie ich es tun kann (wäre wirklich hilfreich, wenn Beispiele verfügbar sind). Danke im Voraus!Ich möchte, dass meine Datenbank (SQL) Updates an die Clientanwendung sendet oder sendet

Antwort

16

Abfragebenachrichtigung wird an einen Service Broker-Dienst weitergeleitet, nicht direkt an Ihre Anwendung. Siehe The Mysterious Notification, um zu verstehen, wie es funktioniert. Ihre Anwendung wartet auf Benachrichtigungen, indem sie eine WAITFOR(RECEIVE) Anweisung in der Datenbank ablegt. Dies bedeutet, dass jeder der 100 Clients einen SQL Server-Arbeitsthread belegt (die Beschränkungen unterliegen, siehe max worker threads Option). Ich habe gesehen, dass dies in der Produktion mit +1000 Clients funktioniert (nachdem ich die Option max worker threads gestoßen habe), aber ich würde gegen empfehlen.

Meine Empfehlung wäre eine Service-Überwachung für die Änderung, mit SqlDependency/QueryNotifications. Dieser Dienst würde dann Benachrichtigungen beispielsweise mit WCF an alle Ihre laufenden Apps senden. Sie würden generische Änderungen (the table Foo was changed) abonnieren, nicht zu bestimmten (the row x in table Foo was inserted).

Als allgemeine Regel SqlDependency/Query Notifications können Sie nur informieren, dass Daten geändert haben, aber es wird nicht die neuen Daten schieben. Die Anwendung muss ihre lokalen Datasets aktualisieren, indem sie die Abfragen erneut ausführt, sobald sie benachrichtigt werden.

3

Seien Sie vorsichtig mit Klasse - es hat die problems mit Speicherlecks. Hovewer, Sie können eine Open-Source-Realisierung der SqlDependency-Klasse verwenden - SqlDependencyEx. Es verwendet einen Datenbankauslöser und eine native Service Broker-Benachrichtigung, um Ereignisse zu den Tabellenänderungen zu empfangen. Dies ist ein Anwendungsbeispiel:

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

Mit SqlDependecyEx Sie können nur UPDATE überwachen, DELETE und INSERT zu vermeiden. Hoffe das hilft.

Verwandte Themen