961 messaggi dal 29 aprile 2002
Ciao, è da molto che non scrivo su questo forum :) sono cambiate un pò di cose nel frattempo :)
Vabbè veniamo al quesito, credo semplice..
Ho un business object nel quale c'è un metodo "GetObjectList", per favorire le performance utilizzo una variabile in cache contenente la lista.. visto che questa da principio non sarebbe cambiata molto spesso.. quindi come al solito prima di interrogare il database interrogo la variabile e ritorno l'oggetto in cache (se esiste.. e quindi nel mio caso se non sono state apportate modifiche ad uno degli oggetti che questa lista recupera) o recuperandolo da db.
Adesso il cliente mi chiede di sincronizzare un determinato campo del db del suo sito con il valore del campo di un database presente nella lan aziendale.. questo per esporre in "tempo reale" il dato aggiornato (in quanto questo dato viene aggiornato + spesso con il software gesionale che appunto si trova in azienda). Ecco quindi che mi ritrovo a scrivere un web service richiamato dalla lan aziendale ogni 2 min che aggiorna il valore del campo in questione sul db remoto. Utilizzo il web service come proxy perchè il db remoto non è esposto a tutta la rete internet..
A questo punto gestire la cache di una lista che viene modificata ogni 2 minuti mi sembra una cosa inutile..
Voi cosa ne pensate?

N.B. la sincronizzazione del dato avviene tramite una app console che và a richiamare il metodo nel web service. Certo.. l'ideale sarebbe stato gestire un trigger del db locale sull'update, ma non si può.. il db locale è un vecchi msaccess 97 :( .. quindi mi ritrovo a simulare un "tempo reale" schedulando ogni due minuti l'aggiornamento..
93 messaggi dal 25 maggio 2005
dunque vediamo intanto se ho capito:

il cliente ha un'applicazione gestionale in loco che utilizza un DB Access. Di questi dati ne interessa uno in particolare, che deve essere "esposto" (quindi in sola lettura?) tramite un sito web che è esterno, quindi DB proprio scollegato da quello aziendale.
Per aggiornare i dati VERSO il sito web hai creato un web service che viene richiamato ogni 2 minuti.

L'unico dubbio che ho è appunto la scrittura dei dati. Comunque è una cosa che puoi gestire internamente al web service se dovesse essere bidirezionale.

Io credo che puoi tranquillamente tenere questi dati in cache, e che puoi rinfrescare la cache direttamente dal web service quando sincronizzi i dati, in modo che il web vada sempre in lettura su questa, e mai sul DB (eccetto modifiche permesse dal web).
961 messaggi dal 29 aprile 2002
Aggiornare direttamente la cache dal metodo del web service? bhè potrebbe essere una soluzione.. a meno che nel frattempo non vengano aggiornati altri dati.. l'obbiettivo è quello di non leggere dati sporchi.. cmq ci provo ;)
93 messaggi dal 25 maggio 2005
be, se non ho capito male io......

ho pensato a questa struttura:

       |    IIS     | 
       |------------|
DB <-->|     BLL    |
       |      +     |
       |    cache   |
       |      |     |
       |  |-------| |
       | sito    WS |<--> Windows App
       |            |
       --------------



Come puoi vedere da questa struttura (spero si capisca), il sito interroga sempre la cache/BLL prima di accedere ai dati sul DB.
Quello che ho pensato è che il webService, oltre a sincronizzare il DB con i dati provenienti dall'app Windows, sincronizza/invalida anche la cache in modo che il sito legga subito i nuovi dati.

ciao
Modificato da Gluck il 09 ottobre 2012 10.58 - http://glucolo.wordpress.com
http://www.facebook.com/glauco.cucchiar
http://www.liveperson.com/glauco-cucchiar/
961 messaggi dal 29 aprile 2002

Quello che ho pensato è che il webService, oltre a sincronizzare il DB con i dati provenienti dall'app Windows, sincronizza/invalida anche la cache in modo che il sito legga subito i nuovi dati.

Sincronizza o invalida? sono due cose diverse.. se dici che il webservice deve sincronizzare la cache, posso anche capirlo.. se invece la invalida significa che i dati devono essere recuperati per forza di cose dal database e rimessi in cache.. ma a questo punto è inutile implementare la cache visto che ogni due minuti questi dati potrebbero cambiare.. siamo sempre allo stesso punto..
Se sincronizzo la cache ed aggiorno il db dal webservice, potrebbe essere una soluzione.. ma credo troppo faticosa per il server, tanto che varrebbe la pena recuperare sempre da db. :) Grazie per l'impegno
93 messaggi dal 25 maggio 2005
dops ha scritto:
Sincronizza o invalida? sono due cose diverse..

e si che lo so che sono diverse, ma non sapendo nulla della tua implementazione/logica del programma.....

tu hai parlato di "UN DATO" nel database, io non so se è un singolo campo intero, o una lista di oggetti.
Ho detto invalidare nel senso che, se questo DATO sta in una chiave particolare nella cache, e viene aggiornato il DB, la cosa più corretta da fare è invalidare immediatamente quella chiave, e:
a - ricaricarla subito
b - farla ricaricare al primo che la deve rileggere

questa è la mia idea.

Poi sta a te ogni possibile modifica e/o rivisitazione e/o miglioria


se invece la invalida significa che i dati devono essere recuperati per forza di cose dal database e rimessi in cache..

cosa buona e giusta per una corretta persistenza dei dati (a mio discutibile parere)


ma a questo punto è inutile implementare la cache visto che ogni due minuti questi dati potrebbero cambiare.. siamo sempre allo stesso punto..

Il tuo sito ha 1 utente che effettua 2 o 3 richieste ogni ora? Ok
Viceversa ASSOLUTAMENTE NO. NON è inutile.
Se il tuo sito ha 100 utenti connessi, e ogni utente cambia pagina/effettua una richiesta ogni 15 secondi, ed il tuo dato in cache sono ad esempio tutte le categorie di un e-commerce, ci sarebbero 100 "select * from tblCategorie inner join tblMacroSettori" ogni 15 secondi, quasi una media di 10 per secondo.
Pensa con numeri più grossi.........
Modificato da Gluck il 09 ottobre 2012 16.30 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Un appunto: il webservice potrebbe essere svincolato dall'onere di aggiornare/invalidare la cache. Infatti, il problema di sapere quando invalidarla esiste indipendentemente da esso.
Ammesso che dops stia usando Sql Server, è possibile legare la voce di cache ad una SqlDependency. Così, quando qualcosa cambia nel database, la voce scadrà automaticamente e l'applicazione sarà costretta a rigenerarla. Questo va bene sia che i valori in tabella siano stati aggiornati dal webservice, dall'applicazione o, a mano, dal Management Studio.

Enjoy learning and just keep making
961 messaggi dal 29 aprile 2002
Gentili utenti di questo post, grazie per il vostro contributo. Sono sicuro che avrete letto il primo post di questa discussione (mi riferisco a Gluck e BrightSoul) ma forse qualcosa è sfuggito.. non ho parlato di DATO in modo generico.. ho specificato che si tratta di un campo del db. Non ho chiesto come fare cosa, fortunatamente ho un pò di esperienza in merito. Quello che avevo era semplicemente un problema di logica, non prettamente tecnico quindi.
Con questo però non voglio offendere nessuno, anzi vi ringrazio ancora per il vostro contributo che è stato sicuramente utile.
Grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.