Esiste un modo per determinare se un database è stato modificato, quindi per inviare nuovi dati all'applicazione

2

Tutte le nostre (la mia azienda) attualmente le applicazioni estraggono le informazioni da quel database, è il loro modo di ottenere i seguenti tipi di databs per spingere i dati o spingere un evento per consentire all'applicazione di estrarre i dati.

  • Accesso
  • SQL
  • Oracle
  • File system (file e cartelle)

Il problema oggi è che gran parte della nostra applicazione trascorre molto tempo guardando costantemente i database e il controllo del file system per vedere se i dati sono cambiati. Sarebbe meglio che il database informasse l'applicazione quando i dati sono cambiati. Ci sono strumenti all'interno di Visual Studio per consentire questo o ci sono strumenti all'interno del database / file system per fare questo?

Tutto pronto ha chiesto questo su overflow dello stack ma nessuna risposta. Ho fatto qualche ricerca in più ma non riesco ad andare oltre. Il mio manager ha chiesto di indagare perché significherebbe che le nostre applicazioni sono molto più veloci ed efficienti.

    
posta StarLordBlair 06.09.2012 - 14:32
fonte

3 risposte

2

Il modo semplice per determinare se i dati sono stati modificati consiste nel mettere una colonna timestamp su ogni tabella pertinente e un trigger su insert e update che aggiorna questa riga a Now . Se vuoi cercare velocemente nuovi dati, inserisci un indice su questa colonna. Quindi memorizza in un'altra tabella l'ultima volta che hai controllato gli aggiornamenti.

Quando controlli gli aggiornamenti, leggi l'orario dell'ultimo aggiornamento, quindi esegui una query su ogni tabella per tutte le righe in cui il timestamp > l'ultimo tempo di aggiornamento. La parte difficile qui è quando si ripristina l'orario dell'ultimo aggiornamento. Se lo ripristini immediatamente dopo averlo letto, potresti ricevere due volte delle modifiche notificate, mentre se lo ripristini dopo aver terminato l'elaborazione degli aggiornamenti, potresti perdere alcuni. Dovrai decidere quale è più accettabile in base ai tuoi requisiti aziendali. (Oppure, se vuoi essere sicuro di non perdere nessuno, avrai bisogno di una riga nella tabella che registri l'orario dell'ultimo aggiornamento per ogni tabella che stai monitorando in questo modo.)

Questo non è esattamente il database che ti informa di cosa è cambiato, ma sta facendo in modo che il DB faccia la contabilità per te, il che semplifica enormemente il lavoro che devi fare.

Eseguirlo su un file system, segue gli stessi principi di base, ma è un po 'più semplice perché hai un timestamp integrato nel file system. Hai solo bisogno di una scansione ricorsiva del file system e filtri qualsiasi cosa il cui ultimo tempo di aggiornamento sia precedente al tempo che stai cercando.

    
risposta data 06.09.2012 - 14:44
fonte
0

Non troverai nulla di nuovo in nessun sistema DB che possa fare questo per te.

Ti consiglio di creare una procedura memorizzata che controlli i dati aggiornati di recente e li registri su una tabella. Avere che SP funziona su un timer. La tua APP avrebbe quindi solo bisogno di interrogare solo una tabella e vedere tutte le modifiche attraverso il sistema.

(Quel SP dovrebbe anche fare un po 'di pulizia di base sul tavolo come eliminare "Vecchie righe)

Se hai bisogno che questo sia più in tempo reale, dovresti creare una serie di trigger DB che aggiornano questa tabella.

Questo sposterebbe il codice in back-end a cui appartiene (e dove lo vuoi).

    
risposta data 06.09.2012 - 14:45
fonte
0

it would mean our applications are much quicker and efficient

In che modo le tue applicazioni sono lente o inefficienti adesso?

  • Questa è un'applicazione GUI con un front-end meno reattivo? Se è così, stai interrogando il database sbagliato. Non dovresti farlo sul thread principale, ma su un altro thread (o task se stai usando .Net).

  • Il tuo codice utilizza già thread per il polling del database eppure l'applicazione è ancora troppo lenta? Forse puoi dare ai thread una priorità più bassa?

  • Se il polling del database sta ancora rallentando l'applicazione, è possibile impostare una seconda applicazione che gestisca il polling e impostare un tipo di comunicazione tra le due applicazioni? Forse un messaggio fa la coda? Ciò sarebbe particolarmente utile se si hanno in esecuzione N copie della propria applicazione poiché ci sarebbe un programma che esegue il polling del database invece di N programmi. Il polling ripetuto di una coda di messaggi dovrebbe essere più veloce del ripetuto polling di un database.

Penso che ciò che vuoi semplicemente non esiste. Quando si invia una richiesta al database, deve sedersi e attendere la richiesta per confermarla. Ciò significa che il database sta eseguendo il proprio polling. Forse è ottimizzato per essere super veloce, ma a un certo livello c'è qualcosa che gira e aspetta un segnale. La tua applicazione deve avere un'immagine speculare di questo per ricevere una risposta dal database.

    
risposta data 18.11.2015 - 21:58
fonte

Leggi altre domande sui tag