web-dev-qa-db-fra.com

Je veux que ma base de données (SQL) informe ou envoie des mises à jour à l'application cliente

Je développais cette application sur VB.net 2010 et SQL 2008.
Je voulais que les clients soient informés des mises à jour sur la base de données et que l’application vérifie si la base de données contient des modifications dans la minute indiquée à l’aide d’une minuterie, ce qui n’est vraiment pas efficace. J'ai lu des articles sur query notification, sqldependency, service broker, mais j'ai lu quelque chose qui disait qu'ils pourraient ne pas être efficaces si j'ai 100 clients et que j'utilise des notifications de requête pour envoyer des notifications Push à mon application.
Quelqu'un pourrait-il m'aider à faire ce que je devrais faire et comment je peux le faire (serait vraiment utile si des exemples sont disponibles). Merci d'avance!

19
mike.dev

La notification de requête sera transférée vers un service Service Broker, pas directement vers votre application. Voir La notification mystérieuse pour comprendre comment cela fonctionne. Votre application attend des notifications en publiant une WAITFOR(RECEIVE) statement sur la base de données . Ce qui implique que chacun des 100 clients occupe un seul thread de travail SQL Server (qui est limité, voir l’option max worker threads ). J'ai vu cela fonctionner en production avec +1000 clients (après avoir augmenté l'option de nombre maximal de threads de travail), mais je vous conseillerais contre .

Ma recommandation serait d'avoir un service de surveillance du changement, à l'aide de SqlDependency/QueryNotifications. Ce service enverrait ensuite des notifications, via WCF par exemple, à toutes vos applications en cours d'exécution. Vous vous abonneriez à des modifications génériques (_the table Foo was changed_) et non à des modifications spécifiques (_the row x in table Foo was inserted_).

En règle générale, SqlDependency/Query Notifications ne peut vous informer que des données ont été modifiées, mais ne transmet pas les données Push new . L'application doit actualiser ses jeux de données locaux en exécutant à nouveau les requêtes, une fois notifiées.

19
Remus Rusanu

Soyez prudent en utilisant SqlDependency class - il a les problèmes avec des fuites de mémoire. Cependant, vous pouvez utiliser une réalisation open source de la classe SqlDependency - SqlDependencyEx . Il utilise un déclencheur de base de données et une notification native Service Broker pour recevoir les événements relatifs aux modifications de la table. Ceci est un exemple d'utilisation:

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

Avec SqlDependecyEx, vous êtes en mesure de surveiller uniquement UPDATE, en évitant DELETE et INSERT. J'espère que cela t'aides.

3
dyatchenko

Si vous ne mettez pas à jour la base de données manuellement et que toutes les manipulations de données se font dans votre application, vous devez détecter les modifications de la couche de service de l'application ou de la couche de gestion au lieu de la base de données si vous dépendez de la technologie de base de données et si vous souhaitez accéder à d'autres bases de données. En revanche, si vous avez une mise à jour manuelle sur la base de données ou que la dépendance à la base de données n’est pas importante, vous pouvez utiliser CDC (chane data capture) et Transférer les modifications dans Service Broker et les modifications de votre application, puis les envoyer au client via une communication http bidirectionnelle. même technologie que SignalR.

0
reza taroosheh