Way Subsonic 3 использует память - PullRequest
1 голос
/ 30 марта 2011

Я попытаюсь провести сравнение между Subsonic 3, Datasets и Entity Framework. Причина в том, что для моей стажировки я должен четко обозначить свой выбор. До сих пор я знаю, что наборы данных работают с данными следующим образом:

  1. БД в память
  2. запрос к БД в памяти
  3. результат запроса

Entity Framework (.NET версия 3.5) делает это следующим образом. (используя .net 3.5, потому что он должен работать в SharePoint 2010, и этот поддерживает только .net 3.5 из-за версии CLR)

  1. запрос к БД
  2. результат, возвращаемый в объекты в памяти
  3. результат возвращен

До сих пор я не нашел схемы для Subsonic 3, как они это делают. я надеюсь, что один из вас может помочь мне

1 Ответ

1 голос
/ 30 марта 2011

Это полностью зависит от стратегии, которую вы используете (ActiveRecord / LinqTemplates / SimpleRepository)

  • ActiveRecord: каждая отдельная запись хранит свой собственный экземпляр в репозитории, что приводит к увеличению памятииспользование для больших списков.

  • LinqTemplates: Гораздо меньше использования памяти, у вас есть экземпляр вашей базы данных, который содержит схему каждой таблицы и чистые данные.

  • SimpleRepository Еще меньше, поскольку экземпляр репо ничего не знает о вашей базе данных.Это почти только использование чистых данных в памяти.

Я бы предложил использовать оба шаблона - ActiveRecord и Linq.Linq для запросов больших списков и ActiveRecord для редактирования отдельных записей или небольших списков (<100 записей). </p>

SubSonic не выполняет кеширование по своему дизайну, поэтому я не стал бы беспокоиться об этом.Но самое замечательное в Linq (для всех трех стратегий) заключается в том, что вы не попадаете в базу данных, пока не нуждаетесь в данных, поэтому вы можете контролировать, сколько памяти вы используете.

Пример:

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);

Обновление: Я не знаю, какое приложение вы разрабатываете, но если вам нужно отобразить данные в DataGrid, я бы предложил использовать devexpress XtraGrid (доступен для WinForms, WPF / Silverlight и ASP.net), который имеет ServerMode, который очень хорошо работает с LinqTemplates SubSonic (поскольку он может быть привязан к IQuerable и сам обрабатывает разбиение на страницы / сортировку / фильтрацию на IQuerable и требует только нескольких записейза один раз. Это значительно сократило объем памяти и производительность загрузки нашего приложения (которое загрузило кучу записей в таблицу данных).

...