L'interrogation est-elle le seul moyen de mettre à jour les données de l'application à partir d'une base de données?

17

Une application doit disposer de données aussi fraîchement mises à jour à partir d'une base de données que possible. Dans un tel cas, existe-t-il un autre moyen d'obtenir les données, en plus d'un temporisateur demandant (interrogeant) la base de données?

Je travaille avec MS SQL Server 2008 (et les applications .NET + Entity Framework), mais j'aimerais également connaître d'autres types de bases de données.

rem
la source
Microsoft StreamInsight est spécialement conçu pour permettre le traitement basé sur les «événements de données». Je n'en sais pas grand-chose, mais cela ressemble à une plate-forme complète et indépendante plutôt qu'à une fonctionnalité individuelle de SQL Server. Voici un diagramme d'architecture StreamInsight .
Nick Chammas

Réponses:

5

Service Broker pour SQL Server 2005+ peut le faire.

Désolé, je ne suis pas sûr des autres SGBDR

gbn
la source
2
Pouvez-vous nous expliquer comment Service Broker procède? @rem demande de récupérer des mises à jour déclenchées par les événements (par opposition aux mises à jour déclenchées par le temps) dans une base de données. SB est destiné aux files d'attente et au traitement asyc.
Nick Chammas
1
-1 Service Broker ne semble pas avoir intégré quoi que ce soit pour faire savoir à une application qu'elle a reçu un message. (Je suis actuellement bloqué sur ce problème.)
Vaccano
10

Dans Oracle, vous pouvez utiliser le package DBMS_ALERT intégré pour faciliter cela.

DBMS_ALERT prend en charge la notification asynchrone des événements de base de données (alertes). En utilisant correctement ce package et les déclencheurs de base de données, une application peut se notifier chaque fois que les valeurs d'intérêt dans la base de données sont modifiées.

Supposons qu'un outil graphique affiche un graphique de certaines données d'une table de base de données. L'outil graphique peut, après lecture et représentation graphique des données, attendre une alerte de base de données (WAITONE) couvrant les données qui viennent d'être lues. L'outil se réveille automatiquement lorsque les données sont modifiées par un autre utilisateur. Tout ce qui est requis est qu'un déclencheur soit placé sur la table de base de données, qui émet un signal (SIGNAL) chaque fois que le déclencheur est déclenché.

Leigh Riffel
la source
Et pour "MS SQL Server 2008" selon la question OPs? Ils ont demandé d'autres SGBDR, mais cela n'aide pas vraiment.
gbn
9
@gbn Pourquoi ça n'aide pas? Je ne peux pas répondre à la partie SQL Server comme vous le pouvez, j'ai donc répondu à la partie que je pouvais. Personne n'est un expert de toutes les autres bases de données, mais si nous apportons chacun nos connaissances, le PO et les futurs visiteurs trouveront des informations utiles. Je m'attendrais à ce que l'OP accepte une réponse SQL Server et vote vers le haut d'autres réponses utiles comme ScottCher (+1).
Leigh Riffel
bien dit. Après avoir lu votre réponse DBMS_ALERT, j'ai appris une autre façon de le faire - plus d'outils pour la boîte à outils! +1
ScottCher
7

Certains fournisseurs de bases de données proposent également des bus de messages intégrés auxquels votre application peut simplement s'abonner:

Une alternative consisterait à acheminer les données dans la base de données en premier lieu via un bus de messages comme Tibco / RV et simplement à le "brancher", en flux entrant dans la base de données et à destination de votre application, ou en utilisant une couche de mise en cache comme la cohérence entre votre application et la base de données.

Gaius
la source
7

ÉCOUTEZ / NOTIFIEZ pour PostgreSQL

http://www.postgresql.org/docs/current/static/sql-notify.html

dans la base de données ...

NOTIFY static_channel_name, 'static-message';

ou dans une fonction / déclencheur:

perform pg_notify('dynamic-channel-name', 'dynamic-message');

dans le client de base de données:

LISTEN some_channel_name; --note the lack of quotes

Le client LISTEN recevra l'ID de processus PostgreSQL, le nom du canal et la valeur du message.

Le pilote JDBC standard pour PostgreSQL n'aime pas les notifications, mais vous pouvez utiliser le pilote https://github.com/impossibl/pgjdbc-ng à cet effet

Neil McGuigan
la source
5

Autre solution Oracle: nous avons développé des applications utilisant le framework dotnet de Microsoft qui tirent parti de la fonction de notification de modification de base de données d'Oracle en collaboration avec ODP.Net (le fournisseur de données Oracle pour dotnet). En utilisant cela, la base de données avertit réellement l'application dotnet lorsque de nouvelles données sont arrivées, ce qui nous permet d'éviter une interrogation constante. Le lien que je référence ci-dessus est un tutoriel Oracle pour faire exactement cela. J'espère que cela vous aidera.

Je ne connais aucun autre SGBDR.

ScottCher
la source
2

Pour l'une de nos applications (accessible via Chrome et UNIQUEMENT Chrome), nous utilisons MySQL avec sys_exec UDF . Fondamentalement, pourquoi Chrome - en raison de la prise en charge de WebSocket.

Une fois qu'une mise à jour / insertion / suppression critique se produit, un programme externe est appelé via la fonctionnalité sys_exec nouvellement ajoutée intégrée dans certains déclencheurs. À ce stade, nous avons tout ce dont nous avons besoin pour relayer le message à chaque client connecté sans avoir besoin d'interrogation ou de requêtes multiples, car tout se passe en temps réel.

Furicane
la source
1

Nous utilisons une combinaison d'Oracle GoldenGate et de l'API Java Persistence (JPA) pour ce faire avec la base de données Oracle, mais aussi avec DB2, Sybase, Microsoft SQL Server, MySQL, Teradata, etc. La fonctionnalité est décrite ici: http: // docs .oracle.com / middleware / 1212 / cohérence / COHIG / golden_g.htm

GoldenGate transforme le journal des transactions de la base de données en un flux d'événements filtrable qui peut être utilisé n'importe où sur le réseau. Nous l'utilisons pour transformer les transactions pertinentes en mises à jour de cache ou en invalidations de cache, qui peuvent toutes deux déclencher des événements au niveau de l'application, par exemple en poussant les données jusqu'à des applications de bureau ou HTML5 Websocket.

(Pour une divulgation complète, je travaille chez Oracle sur l'un des produits utilisant GoldenGate.)

cpurdy
la source