23 messaggi dal 18 febbraio 2011
Salve,
la mia esigenza è la seguente: ho una form in cui seleziono dei parametri ed eseguo un'elaborazione.
Nella pagina successiva visualizzo i risultati e devo dare la possibilità sia di esportare questi risultati che di salvarli.
Ora io stavo pensando di memorizzare i risultati dell'elaborazione in una tabella temporanea e successivamente procedere con le 2 operazioni: secondo voi è corretto come approccio?

Nel caso come dovrei procedere:
- creare una copia fisica della tabella da utilizzare come appoggio? (mi sembra poco professionale come opzione);
- creare "a volo" una tabella temporanea (#tmptable) come copia dell'originale? (potrei avere problemi nel gestirla da una esecuzione query all'altra per via del suo ambito "temporaneo"?)
- inserire i dati in un datatable e salvarlo in sessione (non so se troppo pesante come scelta)
- altro?

Vi sono grato per le indicazioni che mi potrete fornire.
Saluti.
135 messaggi dal 01 febbraio 2017
La soluzione ottimale (secondo me) è utilizzare una DataTable che è proprio una sorta di tabella logica in memoria, che supporta tutta una serie di dati ed operazioni (anche le chiavi, l'unicità, la ricerca ecc).
Puoi fare tutto da lì; la morte sua è quella ! :-)
Ciao.
Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
23 messaggi dal 18 febbraio 2011
SensoBit ha scritto:
La soluzione ottimale (secondo me) è utilizzare una DataTable che è proprio una sorta di tabella logica in memoria, che supporta tutta una serie di dati ed operazioni (anche le chiavi, l'unicità, la ricerca ecc).
Puoi fare tutto da lì; la morte sua è quella ! :-)
Ciao.
Gino.


Quindi, visto che dovrei passare la dt alla view e successivamente dalla view a una delle action richiamate, dovrei memorizzarla in sessione per averla disponibile nei vari passaggi? Non pensi che potrebbe essere troppo pesante ed influire negativamente sulle prestazioni?

Ti ringrazio intanto per la risposta.
11.886 messaggi dal 09 febbraio 2002
Contributi
Non pensi che potrebbe essere troppo pesante

Dipende da quanti dati ci sono dentro e da quanti utenti contemporanei hai. Sfruttare bene la RAM della macchina a scopo di caching ti permette di ottenere prestazioni superiori. Io per esempio non userei la sessione, ma la MemoryCache di ASP.NET che ha un meccanismo di eviction configurabile che può cancellare i valori se la RAM stia per esaurirsi.
Se la tua applicazione gira su più macchine (webfarm), puoi valutare sistemi di caching distribuiti come Redis.

In alternativa, se sei già in ristrettezze di RAM, potresti persistere la DataTable su disco grazie ai suoi appositi metodi di serializzazione.
https://msdn.microsoft.com/it-it/library/system.data.datatable.writexml(v=vs.110).aspx
Anche questa potrebbe essere una strategia valida: accetti di impiegare qualche ms in più per leggere dal disco e per deserializzare il DataTable ma almeno tieni la memoria sgombra.

Solo tu, che conosci il tuo sistema, puoi sapere qual è la soluzione migliore. Per aiutarti nella scelta, usa i performance counters di Windows Server per determinare quali sono i reali consumi della tua applicazione, così puoi decidere dati alla mano.
https://stackify.com/asp-net-performance-counters/

Ovviamente tutto ciò ha senso se la query originale, quella che aveva prodotto i risultati, è così lenta che ha senso mettere i dati in cache. Oppure se è rapida ma è così frequente che sta degradando le prestazioni del database server. Altrimenti, se fosse molto rapida e leggera, potresti salvarti in memoria solo le impostazioni dei filtri e rieseguirla ogni volta che l'utente compie un'operazione, tipo esportare i dati.

ciao,
Moreno

Enjoy learning and just keep making
23 messaggi dal 18 febbraio 2011
L'applicazione ha subito dei cambiamenti nel corso del suo sviluppo: adesso la procedura viene eseguita solo dall'amministratore, su un'unica macchina.
In pratica vengono selezionati dei parametri e vengono eseguite una serie di query (circa 20) a cascata (chiamate in ajax lato client).
I risultati delle query sono sotto i mille record e le elaborazioni (solitamente) vengono eseguite solo una volta, ma siccome alcune query sono un pò lente volevo capire qual è la procedura più corretta da seguire.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


siccome alcune query sono un pò lente volevo capire qual è la procedura più corretta da seguire.

Cache. Per ognuna delle 20 richieste puoi configurare delle strategie di caching differenti. Ad esempio, i risultati che cambiano raramente possono essere tenuti in cache anche per qualche ora, mentre quelli che cambiano spesso li tieni per pochi minuti.

Ti ripropongo il link alla MemoryCache, usala per conservare in memoria le DataTable risultanti dalle tue query. Come chiave cache puoi usare la query stessa o una concatenazione dei filtri usati.
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
Qui ci sono degli esempi:
https://simpledotnetsolutions.wordpress.com/2012/10/07/in-memory-data-caching-few-insights/

Ora hai solo un utente che consuma questi dati, quindi non mi preoccuperei di occupazione di RAM (soprattutto perché i risultati sono meno di un migliaio). Quando avrai centinaia di utenti potrai rivalutare la cosa.

Alla prima richiesta di pagina, l'amministratore dovrà comunque attendere che le query vengano eseguite ma se poi facesse F5 per aggiornare la pagina, i risultati arriverebbero quasi istantaneamente perché vengono recuperati dalla RAM anziché essere rielaborati dal disco.
Se vuoi, puoi evitare all'amministratore anche la prima attesa, facendo alcune delle query da un job in background, almeno quelle senza filtri. Così, quando l'utente arriva, trova già il DataTable in cache.

In alternativa al caching delle DataTable, puoi cachare direttamente l'output della risposta come in questo caso.
http://forum.aspitalia.com/forum/post/419193/MVC-And-Caching.aspx?PageIndex=1

ciao,
Moreno

Enjoy learning and just keep making
23 messaggi dal 18 febbraio 2011
BrightSoul ha scritto:
...
Ti ripropongo il link alla MemoryCache, usala per conservare in memoria le DataTable risultanti dalle tue query. Come chiave cache puoi usare la query stessa o una concatenazione dei filtri usati.
...
Qui ci sono degli esempi:
https://simpledotnetsolutions.wordpress.com/2012/10/07/in-memory-data-caching-few-insights/
...

Sto cercando di implementare l'esempio proposto ma ho il problema che, una volta memorizzata una voce con il datatable, questa non rimane disponibile nelle altre operazioni ma scompare dalle keys disponibili.
Ho impostato il tempo a 60000 secondi pensando che fosse questo il problema, ma niente.
Forse c'è qualcos'altro che devo impostare?
Grazie.

P.S.: questa soluzione di cache a confronto con il memorizzare i datatable in sessione, è molto meno pesante?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
posta un po' di codice, cerchiamo di capire dov'è il problema. Eventualmente prova a mettere in pratica esempi più semplici tipo questo:
https://codeshare.co.uk/blog/simple-reusable-net-caching-example-code-in-c/


questa soluzione di cache a confronto con il memorizzare i datatable in sessione, è molto meno pesante?

Che intendi con "pesante"?
Le risorse della macchina sono a tua disposizione affinché tu possa offrire agli utenti una migliore esperienza d'uso dell'applicazione. Se una query impiega un minuto per essere completata, è preferibile sfruttare la RAM della macchina per tenere in cache il risultato e fare in modo che la pagina si carichi molto più velocemente.
Se metti il datatable in sessione o se usi la MemoryCache, l'occupazione in memoria sarà sempre la stessa, quindi non è né più né meno pesante. Tuttavia, la cache si rivela più versatile:
  • Non è legata alla sessione dell'utente e quindi sopravvive alla chiusura del browser;
  • Puoi gestire il ciclo di vita degli oggetti più precisamente, impostando un tempo di scadenza assoluto oppure che si rinnova ogni volta che l'oggetto viene usato;
  • La puoi sfruttare anche per altri utenti che hanno bisogno di visualizzare gli stessi dati.


ciao,
Moreno

Enjoy learning and just keep making

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.