Way subsonic 3 utilise la mémoire
-
14-11-2019 - |
Question
J'essaie de faire une comparaison entre les ensembles de données subsoniques 3, le cadre d'entité. Jusqu'à présent, je sais encore que les ensembles de données fonctionnent de manière suivante avec la récupération des données:
- Db dans la mémoire
- requête sur db en mémoire
- résulter de la requête
Entity Framework (.NET version 3.5) le fait de la manière suivante. (Utilisation de .NET 3.5 car il doit fonctionner sur SharePoint 2010 et celui-ci ne prend en charge que .NET 3.5 en raison de la version CLR)
- requête sur db
- Résultat renvoyé dans les objets en mémoire
- Résultat renvoyé
Jusqu'à présent, je n'ai pas trouvé de programme pour subsonic 3 comment ils le font. J'espère que l'un de vous pourra m'aider
La solution
Cela dépend totalement de la stratégie que vous utilisez (ActiveRecord / LinqTemplates / SimpleRepository)
ACTIVERECORD: Chaque enregistrement contient sa propre instance à un dépôt, ce qui entraînera une utilisation élevée de la mémoire pour les grandes listes.
LinqTemplates: beaucoup moins d'utilisation de la mémoire, vous avez une instance de votre base de données qui contient le schéma de chaque table et les données pures.
SimpleRepository encore moins, car l'instance Repo ne sait rien de votre base de données. Il ne soit presque que l'utilisation des données pures en mémoire.
Je suggérerais d'utiliser les deux modèles ActiveRecord et Linq. Linq pour interroger les grandes listes, et activeRecord pour modifier des enregistrements uniques ou de petites listes (<100 entrées).
Subsonic ne fait pas de mise en cache par conception, donc je ne m'inquiéterais pas à ce sujet. Mais la grande chose à propos des trucs LINQ (pour les trois stratégies) est que vous ne frappez pas la base de données avant d'avoir besoin des données, afin que vous puissiez contrôler la quantité de mémoire que vous utilisez.
Exemple:
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);
Mise à jour:Je ne sais pas quel type d'application vous développez, mais si vous avez besoin d'afficher des données dans un dataGrid, je suggère d'utiliser le Devexpress XTragrid (disponible pour WinForms, WPF / Silverlight et ASP.NET) qui a un serveur qui fonctionne assez bien avec LinqTemplates de subsonic (car il peut être lié à un iQueable et lui-même gère la pagination / tri / filtrage sur l'iQueable et n'a besoin que de quelques enregistrements à la fois. tasse d'enregistrements dans un dataTable).