Way subsonico 3 utilizza la memoria
-
14-11-2019 - |
Domanda
I'am prova a fare un confronto tra quadro con subsonici 3, set di dati e entità. La ragione per cui è che per il mio tirocinio devo chiarire le mie scelte.Fino ad ora so ancora che i set di dati funzionano nel modo seguente con il recupero dei dati:
- .
- db in memoria
- query su db in memoria
- Risultato dalla query
Framework Entity (.NET versione 3.5) lo fa il seguente modo. (usando .NET 3.5 perché ha bisogno di lavorare su SharePoint 2010 e questo supporta solo .NET 3.5 a causa della versione CLR)
- .
- query su db
- Risultato restituito in oggetti in memoria
- Risultato restituito
Fino ad ora non ho trovato uno schema per subsonico 3 come lo fanno. Spero che uno di voi possa aiutarmi
Soluzione
Dipende totalmente dalla strategia che si sta utilizzando (APRECTORD / LINQTemplates / SimpleRepository)
- .
-
acptivecord: Ogni singolo record tiene la propria istanza in un repo, che porterà ad un elevato utilizzo della memoria per grandi elenchi.
-
linqtemplates: Molto meno utilizzo della memoria, hai un'istanza del tuo DB che detiene lo schema di ogni tabella e i dati puri.
-
Semplerepository Ancora meno, dal momento che l'istanza del repo non sa nulla del tuo database. È quasi solo l'utilizzo dei dati puri in memoria.
Suggerirei di utilizzare entrambi i modelli di APRECTORD e LINQ. LINQ per interrogazioni di grandi liste e ActiveRecord per la modifica di singoli record o piccoli elenchi (<100 voci).
Subsonic non fa la memorizzazione nella cache dal design, quindi non mi preoccuperei. Ma la cosa grande della roba Linq (per tutte e tre le strategie) è che non colpisci il database finché non hai bisogno dei dati, in modo da poter controllare la quantità di memoria che usi.
Esempio:
.var db = new NorthwindDb(); // does not hit the database (just an expression) // since we only need ProductId and ProductName in this example, // there is no need to pull the entiry Product from the database. var query = from p in db.Products where p.CategoryId == 5 select new {p.ProductId, p.ProductName }; // executes: SELECT COUNT(*) FROM products WHERE categoryid = 5; var count = query.Count(); // does not execute anything var top10 = query.Take(10); // executes: SELECT productid, productname // FROM products WHERE categoryid = 5 LIMIT 10 // LIMIT = MySQL paging, don't know how to write that for SQLServer // p in this example is not a product, but an anonymous type with // only two properties (ProductName and ProductId) foreach (var p in top10); Console.WriteLine("ProductId {0} Name {1}", p.ProductId, p.ProductName);
Aggiornamento: Non so quale tipo di applicazione stai sviluppando, ma se è necessario visualizzare i dati in un DataGrid, suggerirei di utilizzare DevExpress Xtragrid (disponibile per WinForms, WPF / Silverlight e ASP.NET) che ha un MODYMODE che funziona abbastanza bene Con i linqTemplates subsonic (poiché può essere vincolato a un querabile e per se stesso gestisce l'incollaggio / ordinamento / filtraggio su Iquadrabile e ha solo bisogno di alcuni record alla volta. Ciò ha notevolmente ridotto l'impronta di memoria e il caricamento delle prestazioni della nostra app (che ha caricato un grappolo di record in un datatariabile).