2015-04-29 7 views
5

AFAIK, Memcached non supporta la sincronizzazione con il database (almeno SQL Server e Oracle). Stiamo progettando di utilizzare Memcached (è gratuito) con il nostro database OLTP.Come implementare Memcached sincronizzato con database

In alcuni processi aziendali eseguiamo alcune pesanti convalide che richiedono molti dati dal database, non possiamo mantenere una copia statica di questi dati poiché non sappiamo se i dati sono stati modificati in modo da recuperare i dati ogni volta che rallenta il processo.

Una possibile soluzione potrebbe essere

  1. Scrivi innesca il database per creare/aggiornare prefisso-postfissati (table-PK1-PK2-PK3-colonna) i file sul cambiamento di record
  2. Monitorare questo cambiamento di lima utilizzando FileSystemWatcher e scadenza la chiave (table-PK1-PK2-PK3-colonna) per ottenere i dati

Problema aggiornamento: ci sarebbero circa 100.000 utenti che utilizzano qualsiasi combinazione di dati per 10 ore. Quindi finiremo per avere un sacco di file, ad es. categ1-subcateg5-subcateg-78-data100, categ1-subcateg5-subcateg-78-data100, categ2-subcateg5-subcateg-78-data100, categ1-subcateg5-subcateg-33-data100, ecc.

Mi aspetto 5 almeno un milione di file. Ora sembra una soluzione patetica :(

Altre possibilità sono

  1. chiamata di un servizio Web in modo asincrono dal grilletto passando la chiave essere scaduto
  2. chiamata un exe da innesco senza aspettare che alla fine e allora questo exe ​​sarebbe scaduto la chiave. (ho avuto un certo successo con questo approccio su SQL Server utilizzando xp_cmdsell per chiamare un exe, chiamare un exe da innesco di Oracle sembra un po 'difficile)
012.351.641,061 mila

Ancora suoni patetici, non è vero?

Eventuali suggerimenti intelligenti per favore

+0

Alcune domande. Questo è per Oracle o Sql Server, o deve essere entrambi? Le tabelle coinvolte cambiano rapidamente o lentamente? Hai qualche budget per questo? – tbone

+0

@tbone Dovrebbe essere per entrambi, e dovrebbe funzionare anche per qualsiasi altro DB se pensiamo di supportare anche quello. Le modifiche sono rapide e in tempo reale. Per ora non ho budget perché sto proponendo questa soluzione da solo – bjan

+1

Peccato tu abbia bisogno di una soluzione "generica" ​​che deve funzionare con entrambe le piattaforme di database, ci sono certamente cose che puoi fare nella configurazione di Oracle che potrebbe aiutare (creare cache, usando SSD, ecc.). Inoltre, se si tratta di una tabella in rapida evoluzione, non sono sicuro che la cache lato app sia l'approccio migliore, poiché invalidere costantemente la cache e ricaricarla comunque. – tbone

risposta

3

MS SQL Server ha caratteristiche "Change Tracking" che forse essere utile a voi. Abilita il database per il rilevamento delle modifiche e configura le tabelle che desideri monitorare. SQL Server crea quindi record di modifiche su ogni aggiornamento, inserimento, eliminazione su una tabella e quindi consente di eseguire query sulle modifiche apportate ai record effettuati dall'ultima volta che è stato selezionato. Questo è molto utile per sincronizzare le modifiche ed è più efficiente dell'uso dei trigger. È anche più facile da gestire rispetto a creare tabelle di monitoraggio personali. Questa è stata una caratteristica in quanto SQL Server 2005.

How to: Use SQL Server Change Tracking

il rilevamento delle modifiche solo cattura le chiavi primarie delle tabelle e lasciare che vi domanda che i campi potrebbero essere stati modificati. Quindi è possibile interrogare le tabelle join su quelle chiavi per ottenere i dati correnti. Se si desidera che acquisisca i dati, è possibile utilizzare Change Capture, ma richiede un overhead e almeno un'edizione aziendale di SQL Server 2008.

Change Data Capture

non ho alcuna esperienza con Oracle, ma credo che potrebbe anche avere alcune funzionalità di tracciamento pure.Questo articolo potrebbe iniziare:

20 Using Oracle Streams to Record Table Changes

+0

Sembra che il rilevamento delle modifiche rimanga a livello di database mentre voglio che la mia app venga informata della modifica. – bjan

+0

Questo è corretto, è solo un mezzo per raccogliere le modifiche dei dati. Dovresti utilizzare le query per raccogliere le modifiche su un intervallo di tempo. Il vantaggio è che non devi controllare le modifiche, devi solo interrogare i record esatti che sono cambiati dall'ultimo controllo, quindi è veloce. È anche robusto dal momento che è tutto transazionale; non ti perderai nessuna modifica.Se non si desidera che l'app esegua il controllo, è possibile scaricarlo su un altro programma di servizio o eseguire semplicemente una stored procedure su un intervallo di tempo, quindi utilizzare un altro metodo di notifica come le code di messaggi di Service Broker. –

+0

@BrianPressler, Oracle ha [Notifica modifica database] (http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgnf.htm#JJDBC28815). L'ho usato in una delle mie app con Java. –

3

Non è chiaro (per me) se l'uso di Memcached è obbligatorio o meno. Lo eviterei personalmente e utilizzerei invece SqlDependency e OracleDependency. Entrambi consentono di passare un comando db e ricevere una notifica quando i dati restituiti dal comando cambiano.

Se Memcached è obbligatorio, è possibile utilizzare ancora queste due classi per attivare l'invalidazione.

+0

Da [questo] (http://stackoverflow.com/questions/14203704/using-sqldependency-vs-periodic-polling-of-a-table-performance-impact) e [this] (http://stackoverflow.com)/questions/22660825/net-sqldependency-with-many-notifications-vs-high-rate-polling) sembra che non sarà una buona soluzione per un database OLTP con un alto tasso di modifiche. [Questo] (http://www.codeproject.com/Articles/144344/Query-Notification-using-SqlDependency-and-SqlCach) afferma addirittura che rallenterà il DB del 43%. – bjan

+0

Link interessanti, ma nessuna soluzione di caching può essere la soluzione perfetta quando i dati cambiano di frequente. – MatteoSp