Il polling è l'unico modo per aggiornare i dati dell'app da un database?


17

Un'applicazione deve avere i dati il ​​più aggiornati possibile da un database. In tal caso, esiste un altro modo per ottenere i dati, oltre a un timer che richiede (polling) il database?

Lavoro con MS SQL Server 2008 (e applicazioni .NET + Entity Framework), ma vorrei conoscere anche altri tipi di database.


Microsoft StreamInsight è progettato specificamente per abilitare l'elaborazione basata su "evento dati". Non ne so molto, ma sembra una piattaforma completa e indipendente piuttosto che una singola funzionalità di SQL Server. Ecco un diagramma di architettura StreamInsight .
Nick Chammas,

Risposte:


5

Service Broker per SQL Server 2005+ può farlo.

Spiacenti, non sono sicuro di altri RDBMS


2
Puoi approfondire come funziona Service Broker? @rem sta chiedendo informazioni sul recupero di aggiornamenti attivati ​​da eventi (anziché attivati ​​dal tempo) da un database. SB è per l'accodamento e l'elaborazione asyc.
Nick Chammas,

1
-1 Service Broker non sembra avere nulla incorporato per far sapere a un'app che ha ricevuto un messaggio. (Al momento sono bloccato su questo problema.)
Vaccano,

10

In Oracle è possibile utilizzare il pacchetto DBMS_ALERT integrato per facilitare ciò.

DBMS_ALERT supporta la notifica asincrona degli eventi del database (avvisi). Con l'uso appropriato di questo pacchetto e dei trigger del database, un'applicazione può notificarsi ogni volta che vengono modificati i valori di interesse nel database.

Supponiamo che uno strumento grafico stia visualizzando un grafico di alcuni dati da una tabella del database. Lo strumento grafico può, dopo aver letto e rappresentato graficamente i dati, attendere un avviso di database (WAITONE) che copre i dati appena letti. Lo strumento si riattiva automaticamente quando i dati vengono modificati da qualsiasi altro utente. Tutto ciò che serve è che un trigger sia posizionato sulla tabella del database, che esegue un segnale (SIGNAL) ogni volta che viene attivato il trigger.


E per "MS SQL Server 2008" come da domanda OP? Hanno chiesto altri RDBMS ma questo in realtà non aiuta.
gbn

9
@gbn Perché non aiuta? Non posso rispondere alla parte di SQL Server come puoi, quindi ho risposto alla parte che potevo. Nessuno è un esperto di tutti gli altri database, ma se ognuno di noi fornisce le proprie conoscenze, l'OP e i futuri visitatori troveranno informazioni utili. Mi aspetto che l'OP accetti una risposta di SQL Server e voti utili come altre risposte utili come ScottCher (+1).
Leigh Riffel,

ben detto. Dopo aver letto la tua risposta DBMS_ALERT, ho imparato un altro modo per farlo: più strumenti per la cassetta degli attrezzi! +1
ScottCher

7

Alcuni fornitori di database forniscono anche bus di messaggi integrati a cui l'app può semplicemente iscriversi:

Un'alternativa sarebbe in primo luogo instradare i dati nel database tramite un bus di messaggi come Tibco / RV e semplicemente "diramarli", sul flusso che va nel DB e uno che va alla vostra applicazione, o utilizzare un livello di cache come Coherence tra la tua app e il DB.


7

ASCOLTA / NOTIFICA per PostgreSQL

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

nel database ...

NOTIFY static_channel_name, 'static-message';

o in una funzione / trigger:

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

nel client del database:

LISTEN some_channel_name; --note the lack of quotes

Il client LISTEN riceverà l'ID del processo PostgreSQL, il nome del canale e il valore del messaggio.

Al driver JDBC standard per PostgreSQL non piacciono le notifiche, tuttavia è possibile utilizzare il driver https://github.com/impossibl/pgjdbc-ng per questo scopo


5

Un'altra soluzione Oracle: abbiamo sviluppato applicazioni utilizzando il framework dotnet di Microsoft che sfruttano la funzionalità di notifica di modifica del database di Oracle in collaborazione con ODP.Net (il provider di dati Oracle per dotnet). Usando questo, il database in realtà notifica all'applicazione dotnet quando sono arrivati ​​nuovi dati permettendoci di evitare il polling costante. Il link a cui faccio riferimento sopra è un tutorial Oracle per fare proprio questo. Spero che questo ti aiuti.

Non so di nessun altro RDBMS.


2

Per una delle nostre applicazioni (accessibile tramite Chrome e SOLO Chrome), stiamo usando MySQL con UDF sys_exec . Fondamentalmente, perché Chrome - grazie al supporto WebSocket.

Quando si verifica un aggiornamento / inserimento / eliminazione critico, viene richiamato un programma esterno tramite la funzionalità sys_exec appena aggiunta incorporata in determinati trigger. A quel punto, abbiamo tutto ciò di cui abbiamo bisogno per inoltrare il messaggio a ogni client connesso senza bisogno di polling o query multiple poiché tutto accade in tempo reale.


1

Usiamo una combinazione di Oracle GoldenGate e Java Persistence API (JPA) per farlo con il database Oracle, ma anche con DB2, Sybase, Microsoft SQL Server, MySQL, Teradata, ecc. La funzionalità è descritta qui: http: // docs .oracle.com / middleware / 1212 / coerenza / COHIG / golden_g.htm

Ciò che GoldenGate fa è trasformare il registro delle transazioni del database in un flusso di eventi filtrabile che può essere utilizzato in qualsiasi punto della rete. Lo usiamo per trasformare le transazioni rilevanti in aggiornamenti della cache o invalidazioni della cache, entrambi i quali possono innescare eventi a livello di applicazione, ad esempio spingendo i dati fino alle applicazioni desktop o Web5 HTML5.

(Per una divulgazione completa, lavoro presso Oracle su uno dei prodotti utilizzando GoldenGate.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.