Forma Subsónico 3 usa a memória
-
14-11-2019 - |
Pergunta
Estou a tentar fazer uma comparação entre Subsónico 3, Conjuntos de dados e o Entity Framework.A razão é que para o meu estágio eu tenho que deixar claro que as minhas escolhas.Até agora, eu sei ainda que Conjuntos de dados funciona da seguinte maneira: com a recuperação de dados:
- DB na memória
- consulta em base de dados em memória
- resultado da consulta
Entity Framework (.NET versão 3.5) faz da seguinte forma.(usando .net 3.5 porque ele precisa trabalhar no SharePoint 2010 e este só oferece suporte .net 3.5 devido a versão do CLR)
- consulta em DB
- resultado retornado em objetos na memória
- resultado retornado
Até agora eu não encontrei um regime Subsônico 3 como eles fazem isso.eu espero que um de vocês pode me ajudar
Solução
É totalmente depende da estratégia que você está usando (ActiveRecord / LinqTemplates / SimpleRepository)
ActiveRecord:Cada Registro possui sua própria instância de um acordo de recompra, o que irá resultar no uso de memória alta para listas grandes.
LinqTemplates:Muito menos uso de memória, você tem uma instância do seu banco de dados que contém o esquema de cada tabela e os dados puros.
SimpleRepository Menos ainda, uma vez que o repo instância não sabe nada sobre o seu banco de dados.É quase só o uso do puro dados na memória.
Gostaria de sugerir o uso de ambos, o ActiveRecord e Linq Modelos.O Linq para consultar listas grandes, e o ActiveRecord para a edição de simples registros ou listas pequenas (<100 entradas).
Subsónico não fazer cache de design, então eu não me preocuparia com isso.Mas a grande coisa sobre o Linq coisas (para as três estratégias) é que você não acertar o banco de dados até que você precisar dos dados, assim você pode controlar o quanto de memória você utilizar.
Exemplo:
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);
Atualização: Eu não sei que tipo de aplicação que você está desenvolvendo, mas se você precisar exibir dados em um DataGrid gostaria de sugerir o uso devexpress XtraGrid (disponível para WinForms, WPF/Silverlight e ASP.net), que tem uma ServerMode que funciona muito bem com o SubSonic é LinqTemplates (uma vez que pode ser vinculado a um IQuerable e a própria lida com a paginação/classificação/filtragem IQuerable, e precisa apenas de alguns registros em uma hora.Que reduziu significativamente o consumo de memória e desempenho do carregamento da nossa aplicação (que carregado um monte de registros em um datatable).