web-dev-qa-db-fra.com

Fiabilité SqlDependency?

Ma situation actuelle est que j'ai une application qui doit être notifiée lorsque de nouvelles données arrivent dans une table de base de données. Les données proviennent d'une source externe (sur laquelle je n'ai aucun contrôle - c'est cette seule option d'intégration). Lorsque de nouvelles données arrivent, mon application doit effectuer certaines actions - essentiellement rechercher les nouvelles données, les gérer, insérer le résultat dans une table locale, etc.

Je veux éviter les sondages si possible, car les données devraient être traitées en temps réel. Cela dit, s'assurer qu'aucune donnée ne soit jamais manquée est la priorité n ° 1.

Mes questions:

  1. SqlDependency est-il généralement considéré comme fiable?
  2. Dois-je être préoccupé par les conditions de course, par exemple Je gère un changement quand un autre arrive?
  3. Que se passe-t-il lorsque la base de données est redémarrée? Mon application récupérera-t-elle et recommencera-t-elle à recevoir des modifications, ou aurai-je besoin d'un minuteur de sécurité qui me réabonnera périodiquement aux notifications?
  4. La plupart des articles que j'ai lus sur le sujet concernent SQL Server 2005. J'utilise SQL Server 2008 R2. Existe-t-il une technique plus récente qui est préférée à SqlDependency?
  5. (Modifier) ​​Aussi, que faire si l'application tombe en panne? Je suppose que je devrais demander des données manquées au démarrage?
43
Phil Sandler

1) Oui, je le considère comme fiable car il fait correctement le but a été conçu pour le faire (invalidation du cache)

2) Non. C'est pourquoi vous ne pouvez vous abonner qu'en émettant une requête, cela garantit qu'il n'y a pas de course entre la récupération des données et les nouvelles mises à jour notifiant

3) Le redémarrage de la base de données (ou de l'instance) signale toutes les notifications de requête en attente avec une SqlNotificationInfo valeur de Restart. Lisez comment SqlDependency et est basé sur Query Notification pour une meilleure compréhension. Comme SqlDependency maintient une connexion ouverte à la base de données en permanence, une indisponibilité de la base de données sera détectée par SqlDependency avant même toute notification de requête explicite

4) Non. Plus d'informations à ce sujet plus bas ...

5) Il n'y a pas de "données manquées". La notification de requête (et par conséquent SqlDependency) ne vous informe jamais de quoi données modifiées. Il vous informe seulement que il a changé. Vous êtes toujours censé revenir en arrière et lire tout les données pour voir ce qui avait changé (et je vous renvoie à la question/réponse n ° 2). Une application nouvellement démarrée n'avait pas encore interrogé les données au départ, il n'y a donc aucun changement à notifier. Seulement après il a d'abord interrogé les données peut-il recevoir une notification.

D'après la description de votre problème, je ne suis pas convaincu que vous ayez besoin de notifications de requête. Il me semble que vous voulez agir sur tout changement, peu importe quand il s'est produit, même si votre application n'était pas en cours d'exécution . Ce n'est certainement pas une invalidation du cache, mais un suivi des modifications. Par conséquent, vous devez déployer une technologie de suivi des modifications, telle que Change Data Capture ou Change Tracking , qui sont tous deux SQL Server 2008 et versions ultérieures uniquement (non disponibles dans SQL Server 2005) . Avec SQL Server 2005, il n'est pas rare de déployer un déclencheur et de mettre en file d'attente un message pour Service Broker pour gérer le même problème que vous essayez de gérer (détecter les modifications, réagir à chaque ligne de nouvelles données).

55
Remus Rusanu

Venir du point de vue d'un développeur .net à vouloir simplement l'utiliser pour l'invalidation du cache a été une vraie douleur et n'est pas complètement fiable.

La configuration et le dépannage ont été particulièrement pénibles, nous le faisons fonctionner correctement dans un environnement mais ensuite cela ne fonctionne pas dans un autre. Comprendre pourquoi a été difficile et chronophage.

Même quand tout est en marche, il n'est pas totalement fiable. SQL Server peut supprimer les notifications s'il est soumis à une charge importante et qu'il existe des problèmes connus de redémarrage et de non-reprise des notifications: http://connect.Microsoft.com/SQLServer/feedback/details/543921/sqldependency-incorrect-behaviour -after-sql-server-redémarre .

J'éviterais s'il y avait une technologie alternative qui fait ce que vous voulez et est moins gênante.

4
Mant101