Certains changements de données dans la base de données. Comment puis-je déclencher un code C # faire des travaux sur ces changements?

StackOverflow https://stackoverflow.com/questions/513940

  •  21-08-2019
  •  | 
  •  

Question

Supposons que j'ai une application A avec une base de données. Maintenant, je veux ajouter une autre application B, qui devrait garder une trace des changements de base de données d'application A. Application B doit faire des calculs, lorsque les données ont changé. Il n'y a pas de communication directe entre les deux applications. Les deux ne peuvent voir la base de données.

Le problème de base est: Certaines modifications de données dans la base de données. Comment puis-je déclencher un code C # faire des travaux sur ces changements?


Pour donner une impulsion pour trouver des réponses, je mentionne certaines approches que je suis en train d'examiner:

  1. polling application B les changements dans les tableaux d'intérêt. Avantage: approche simple. Inconvénient: Beaucoup de trafic, surtout quand le nombre de tables impliqués.
  2. Présentez les déclencheurs qui titilleront sur certains événements. Quand ils feu ils doivent écrire une entrée dans un « Table d'événements ». Application B seulement doit au sondage que « table d'événements ». Avantage: Moins de circulation. Inconvénient: Logic est placé dans la base de données sous forme de triggers. (Ce n'est pas une question de « Méchancetés » des déclencheurs. Il est une conception question, ce qui en fait un inconvénient.)
  3. Débarrassez-vous de l'approche du scrutin et utiliser la classe SqlDependency pour obtenir notifié des changements. Avantage: (Peut-être?) Moins de trafic que vote approche. Inconvénient: Non base de données indépendant. (Je suis conscient de OracleDependency à ODP.NET, mais ce sur les autres bases de données?)

Quelle approche est plus favorable? Peut-être que je l'ai manqué un avantage important (dis) dans les approches mentionnées? Peut-être il y a d'autres approches que j'ai pas penser?


Edit 1: Base de données est un facteur indépendance pour le ... appelons-les ... « les vendeurs ». Je peux utiliser SqlDependency ou OracleDependency. Pour DB2 ou d'autres bases de données, je peux revenir à l'approche du scrutin. Il est juste une question de coûts et d'avantages, que je veux au moins penser à que je puisse en discuter.

Était-ce utile?

La solution

Je vais avec # 1. Ce n'est pas fait autant de trafic que vous pourriez penser. Si vos données ne change pas souvent, vous pouvez être pessimiste à ce sujet et ne chercher quelque chose qui vous donne un yay ou non des changements de table.

Si vous concevez votre schéma avec interrogation à l'esprit que vous ne pouvez pas engager vraiment beaucoup d'un coup par sondage.

  • Si vous ne l'ajout d'enregistrements, pas les changer, vérifier alors le plus haut id est peut-être assez sur une table particulière.

  • Si vous les mettez à jour tout alors vous pouvez stocker une colonne d'horodatage et l'index, regardez alors pour l'horodatage maximale.

  • Et vous pouvez envoyer une requête ubber que les sondages multiples talbes (efficace) et renvoie la liste des tables modifiées.

Rien dans cette réponse est particulièrement intelligente, je suis juste essayer de montrer que # 1 ne peut pas être aussi mauvais que cela semble au premier abord.

Autres conseils

Je voudrais aller avec une solution # 1 (vote), car en évitant les dépendances et les connexions directes entre des applications distinctes peuvent aider à réduire la complexité et les problèmes.

Je pense que vous avez couvert les approches que je l'ai pensé, il n'y a pas absolue « meilleure » façon de le faire, ce qui importe sont vos besoins et priorités .

Personnellement, j'aime l'élégance de la classe SqlDependency; et ce qui importe l'indépendance de base de données dans le monde réel pour la plupart des applications de toute façon? Mais si elle est une priorité pour vous d'avoir l'indépendance de base de données, vous pouvez donc pas utiliser.

Polling est mon deuxième favori, car elle conserve la base de données propre à partir des déclencheurs et la logique d'application; il est vraiment pas une mauvaise option, car de toute façon que vous le dites est simple. Si l'application B peut attendre quelques minutes à une heure avant « remarquer » changements de base de données, ce serait une bonne option.

Donc, ma réponse est: cela dépend. :)

Bonne chance!

  1. Avez-vous vraiment au sujet de l'indépendance de base de données?
  2. Ne serait-il vraiment si difficile de créer un mécanisme de différence pour chaque type de base de données que tous ont la même interface publique?
  

Je suis au courant de OracleDependency dans ODP.NET, mais quid des autres bases de données?

SQL Server a quelque chose comme ça, mais je ne l'ai jamais utilisé.

Vous pouvez faire une classe MySqlDependency, et mettre en œuvre SqlDependency ou SqlDependencyForOracle (mise en commun)

Vous pouvez utiliser un déclencheur SQL dans un et exécutez votre SQL CLR Database Project code dans ce projet, voir: https://msdn.microsoft.com/en-us/library/938d9dz2.aspx

Ou, sur la détente à l'intérieur du <=> vous pouvez faire une demande du projet au <=> que vous voulez réellement agir sur la gâchette.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top