Domanda

Abbiamo un'applicazione che prende i dati in tempo reale e li inserisce nel database. è in linea per 4,5 ore al giorno. Inseriamo secondo i dati dal secondo in 17 tavoli. L'utente può in qualsiasi momento interrogare qualsiasi tavolo per gli ultimi secondi di dati e alcuni record nella storia ...

Cura l'alimentazione e l'inserimento viene fatto utilizzando un C # applicazione console ...

Gestione richieste degli utenti viene fatto attraverso un servizio WCF ...

Abbiamo capito che l'inserimento è il nostro collo di bottiglia; la maggior parte del tempo è preso lì. Abbiamo investito un sacco di tempo a cercare di perfezionare le tabelle e indecies ma i risultati non sono stati soddisfacenti

Supponendo che abbiamo la memoria suffecient, che cosa è la pratica migliore per inserire i dati in memoria, invece di avere database. Attualmente stiamo usando DataTable sono aggiornati e inseriti ogni secondo Un nostro collega ha suggerito un altro servizio WCF invece di dati tra il feed-conduttore e il WCF user-richieste-gestore. Lo strato intermedio WCF dovrebbe essere basata su TCP e mantiene i dati nella propria memoria. Si può dire che il gestore di alimentazione potrebbe fare con user-richieste invece di avere uno strato intermedio tra 2 processi, ma vogliamo le cose separate quindi se il feed-handler si blocca vogliamo essere ancora in grado di fornire all'utente i record attuali

sono limitati nel tempo, e vogliamo spostare tutto a memoria nel breve periodo. Sta avendo un WCF in mezzo a 2 processi una brutta cosa da fare? So che le richieste di aggiungere un po 'alto, ma tutti questi 3 processi (feed-handler, in-memory database (WCF), user-richiesta-handler (WCF) stanno per essere sulla stessa macchina e la larghezza di banda non sarà più di tanto di un problema.

Si prega di aiutare!

È stato utile?

Soluzione

I apparirebbe nella creazione di una cache dei dati (in modo tale che si può anche ridurre seleziona di database), ei dati di invalidazione nella cache una volta che è stato scritto nel database. In questo modo, si può ammucchiare le chiamate a fare un inserto più grande al posto di molti più piccoli, ma mantenere i dati in memoria in modo che i lettori possano leggerlo. In realtà, se si sa quando i dati va stantio, si può evitare di leggere il database del tutto e usarlo solo come un archivio di backup -. In questo modo, le prestazioni del database avrà effetto solo quanto grande la cache viene

Annullamento dei dati nella cache o sarà basato sul se la sua scritti nel database o il suo stantio andato, che viene sempre ultima , non prima.

Il livello della cache non ha bisogno di essere complicato, tuttavia dovrebbe essere multi-threaded per ospitare i dati e anche risparmiare in background. Questo strato si sedeva proprio dietro il servizio WCF, il mezzo di connessione, e il servizio WCF deve essere migliorato per contenere la logica del l'idea di dosaggio console app +. Poi il console app può semplicemente collegarsi al WCF e buttare i risultati a questo.

Aggiornamento: l'unica altra cosa da dire è investire in un profiler per vedere se si stanno introducendo eventuali problemi di prestazioni nel codice che vengono mascherati. Inoltre, il profilo del database. Lei parla è necessario inserti veloci e seleziona - purtroppo, di solito trade-off contro l'altro ...

Altri suggerimenti

Che tipo di database stai usando? MySQL ha una memoria storage engine che sembrerebbe essere adatto a questo genere di cose.

Si sta utilizzando DataTable con DataAdapter? Se è così, mi sento di raccomandare che si rilascia completamente. Inserisci i tuoi record direttamente utilizzando DbCommand. Quando gli utenti richiedono report, leggere i dati utilizzando DataReader, o compilare DataTable oggetti utilizzando DataTable.Load (IDataReader).

Storying dati in memoria ha il rischio di perdere i dati in caso di crash o interruzioni di corrente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top