Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Оптимизация ASP MVC сайта (структура БД) / 20 сообщений из 20, страница 1 из 1
06.10.2015, 10:42
    #39069078
Sputnick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
Всем привет!

Сделал сайт на ASP MVC + MS SQL + EF6 (DB first подход).
Все работает, но скорость не айс, смотрю чтобы оптимизировать... спецы подскажите пж.

Однозначно кривое решение:
Основная таблица - записи. Есть Поле просмотры. При входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были)

Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры":

ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров

И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.


Может апдейт делать через такую схему:

var obj = new Article { ArticleId = 1 };
context.Articles.Attach(obj);
obj.Title = "123";
context.SaveChanges();

чтобы без процедуры.
...
Рейтинг: 0 / 0
06.10.2015, 12:30
    #39069234
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
Sputnick,

общий принцип высокой производительности веб-приложений

1. кеширование страниц (результатов действий контроллеров) на клиенте
2. кеширование страниц (результатов действий контроллеров) на сервере
3. кеширование данных на сервере (получаемых из БД)
4. кеширование инфрастуктуры
5. чё там по оптимизации ASP.NET MVC / MS SQL )

и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше.

тогда можно будет профилировать и смотреть где затык.

также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь.
...
Рейтинг: 0 / 0
06.10.2015, 13:30
    #39069348
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVosttSputnick,

общий принцип высокой производительности веб-приложений

1. кеширование страниц (результатов действий контроллеров) на клиенте
2. кеширование страниц (результатов действий контроллеров) на сервере
3. кеширование данных на сервере (получаемых из БД)
4. кеширование инфрастуктуры
5. чё там по оптимизации ASP.NET MVC / MS SQL )

и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше.

тогда можно будет профилировать и смотреть где затык.

также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь.Ты забыл в начале тестирование и мониторинг :)

Например SQL Server Activity Monitor может показать тяжёлые запросы и предложить создать индексы. И этого будет достаточно.
...
Рейтинг: 0 / 0
06.10.2015, 13:32
    #39069352
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
SputnickВсем привет!

Сделал сайт на ASP MVC + MS SQL + EF6 (DB first подход).
Все работает, но скорость не айс, смотрю чтобы оптимизировать... спецы подскажите пж.

Однозначно кривое решение:
Основная таблица - записи. Есть Поле просмотры. При входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были)

Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры":

ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров

И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.


Может апдейт делать через такую схему:

var obj = new Article { ArticleId = 1 };
context.Articles.Attach(obj);
obj.Title = "123";
context.SaveChanges();

чтобы без процедуры.расставьте вопросительные знаки по своему вкусу.
...
Рейтинг: 0 / 0
06.10.2015, 13:36
    #39069363
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
SputnickПри входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были)

Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры":

ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров

И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.Ни фига не понял.

" При входе в запись идет выборка значений с табл "записи" " - это что значит?

Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи?
Плюс выполняется UPDATE одной строки по этому же идентификатору?

ИМХО можно это в хранимку занести.

Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы?
...
Рейтинг: 0 / 0
07.10.2015, 15:33
    #39070887
Sputnick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVosttSputnick,

общий принцип высокой производительности веб-приложений

1. кеширование страниц (результатов действий контроллеров) на клиенте
2. кеширование страниц (результатов действий контроллеров) на сервере
3. кеширование данных на сервере (получаемых из БД)
4. кеширование инфрастуктуры
5. чё там по оптимизации ASP.NET MVC / MS SQL )

и ещё. «скорость не айс» лучше подтверждать какими-то данными, типа средняя скорость загрузки разных страниц, где больше работы с БД и где меньше.

тогда можно будет профилировать и смотреть где затык.

также, если сервак дохлый и/или памяти мало, то тут ничего уже не поделаешь.
-------------

1, 2. Это делаю - [OutputCache(Duration = 360, Location = System.Web.UI.OutputCacheLocation.ServerAndClient)]
и для дочерних [OutputCache(Duration = 280)]

3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней.
...
Рейтинг: 0 / 0
07.10.2015, 15:47
    #39070910
Sputnick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANASputnickПри входе в запись идет выборка значений с табл "записи" и апдейт +1 к просмотрам (апдейт делаю через хранимую процедуру, раньше через EF делал - вообще тормоза были)

Возможно боле правильно (увеличение производительности) будет создать табличку "просмотры":

ид (первичный, индексированный) | ид_записи (индексированный, уникальный) | кол-во просмотров

И при выборке записи обновлять в "просмотры" а не в той таблице, с которой данные записи берут.Ни фига не понял.

" При входе в запись идет выборка значений с табл "записи" " - это что значит?

Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи?
Плюс выполняется UPDATE одной строки по этому же идентификатору?

ИМХО можно это в хранимку занести.

Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы?

Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи?
Плюс выполняется UPDATE одной строки по этому же идентификатору?
--
да.

Таблица "записи"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE [dbo].[Records] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [Title] nvarchar(150) COLLATE Ukrainian_CI_AS NOT NULL,
  [Text] nvarchar(max) COLLATE Ukrainian_CI_AS NOT NULL,
  [Type] int NOT NULL,
  [Category] int NULL,
  [DateTimePublish] datetime NOT NULL,
  [DateTimeActivate] smalldatetime NULL,
  [User_id] int NOT NULL,
  [is_publish] bit CONSTRAINT [DF_Records_is_publish] DEFAULT 0 NOT NULL,
  [PathThumbnail] nvarchar(50) COLLATE Ukrainian_CI_AS NULL,
  [Anonse] nvarchar(150) COLLATE Ukrainian_CI_AS NULL, 
  [Approve] bit NULL,
  [Deleted] bit DEFAULT 0 NULL,
  [Views] int NULL, 
  [Uniq] bit DEFAULT 0 NOT NULL,
   varchar(300) COLLATE Ukrainian_CI_AS NULL,
  [Section] int DEFAULT 5 NOT NULL,
  [CommentsOpen] bit DEFAULT 1 NOT NULL,
  CONSTRAINT [PK_Records] PRIMARY KEY CLUSTERED ([id]),
  CONSTRAINT [FK_Records_CategoriesRecord] FOREIGN KEY ([Category]) 
  REFERENCES [dbo].[CategoriesRecord] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [FK_Records_TypesRecord] FOREIGN KEY ([Type]) 
  REFERENCES [dbo].[TypesRecord] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [FK_Records_Users] FOREIGN KEY ([User_id]) 
  REFERENCES [dbo].[UserProfile] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)





таблица СЕО

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE [dbo].[SEO] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [id_record] int NOT NULL,
  [Title] varchar(150) COLLATE Ukrainian_CI_AS NULL,
  [Keywords] varchar(150) COLLATE Ukrainian_CI_AS NULL,
  [Description] varchar(250) COLLATE Ukrainian_CI_AS NULL,
  [Direct] bit NULL,
  PRIMARY KEY CLUSTERED ([id]),
  UNIQUE ([id_record]),
  CONSTRAINT [SEO_fk_record] FOREIGN KEY ([id_record]) 
  REFERENCES [dbo].[Records] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)




Выборка одиночной записи + апдейт кол-ва просмотров (поле [Views]):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
 public Record GetRecordById(int id_record, bool? ViewPlus = false) 
        {          


            if (db == null) { db = new T_DLL.Model.TDBEntities(); }
			
            //возвращаем 1 дб объект
            var record = (from rec in db.Records
                           join usr in db.UserProfiles on rec.User_id equals usr.id
                           join typ in db.TypesRecord on rec.Type equals typ.id
                           join cat in db.CategoriesRecord on rec.Category equals cat.id
                           join seo_source in db.SEOs on rec.id equals seo_source.id_record 
                           into t1
                           from seo in t1.DefaultIfEmpty()
                           where rec.id == id_record && rec.Deleted == false
                           select new { record = rec, user = usr, TypeName = typ, PathImgCategory = cat, seo = seo }).FirstOrDefault();

            
           
              //УВЕЛИЧИМ ПРОСМОТР ЕСЛИ ИСТИНА
            if (ViewPlus == true)
            {
                ViewPlusM(record.record.id);                 
            }
          

                 
            return   MapToRecordsBLLseo(record.record, record.user, record.TypeName, record.PathImgCategory, record.seo); 
        }



        public void ViewPlusM(int id_record) 
        {                   
             
                


                using (var db = new T_DLL.Model.TDBEntities())
                {

                    string sql = "update Records set Views = @Views_Now where id = @id_rec";
                    
                    List<System.Data.SqlClient.SqlParameter> parameterList = new List<System.Data.SqlClient.SqlParameter>();

                    parameterList.Add(new System.Data.SqlClient.SqlParameter("@id_rec", id_record));                  
                  
                    System.Data.SqlClient.SqlParameter[] parameters = parameterList.ToArray();

                    int result = db.Database.ExecuteSqlCommand(sql, parameters);                     

                }



процедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.AddView @id_rec int
AS
BEGIN

update Records

SET Views = Views + ABS(Checksum(NewID()) % 3) + 2
 
where id = @id_rec
 

END





----
думаю нужно для поля [DateTimePublish] datetime NOT NULL, индекс тоже сделать, так как в архиве по дате выборка идет очень долго.
...
Рейтинг: 0 / 0
08.10.2015, 06:14
    #39071415
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
Sputnick3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней.

нет, за пределами контекста, в своём кеширующем блоке. например, достаёшь много данных, чтобы сформировать сложную структурную модель и кешируешь её в своём сервисе, чтобы не лазить в БД каждый раз, и продумываешь механизм для инвалидации данных в кеше при их изменений, чтобы всегда получать актуальные данные.

некоторые данные можно полностью кешировать: часто используемые справочники, таблица пользователей и прав, и другие таблицы, к которым идёт частое обращение, и там данных относительно немного. только требуется качественный механизм инвалидации, иначе начнутся проблемы с рассинхроном. также надо учитывать объёмы доступной памяти, которую можно эксплуатировать. возможен вынос кеша в оперативную БД на стороне сервера приложений, тут всё зависит от самих данных и требований к нагрузкам.
...
Рейтинг: 0 / 0
08.10.2015, 09:27
    #39071504
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
я мож с утра подтупливаю, но скорость чего не айс? внесения изменения? или хождение по сайту? тут разговоры пошли о кеше и все дела но блин ТС ты профилировал сайт чем либо ? или бездумно воткнул кеш на авойсь прокатит? хоть какая то статистика есть? все что хвост говорит правильно, я не спорю, но опять ж я не понял из прочитанного нагрузки на приложение, мож там 10 человек + кеш и все тормозит тогда я больше склоняюсь к тому что кривое сделано, а может у тс там десятки тысяч людей, а мы тут играем в гадалку.
...
Рейтинг: 0 / 0
08.10.2015, 09:40
    #39071531
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
Sputnick3. Ты имеешь в виду когда результат запроса сохраняется в контексте, а потом - context.Orders.Find(id); ? Если нет можно этот момент пж подробней.Про кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :)
...
Рейтинг: 0 / 0
08.10.2015, 09:49
    #39071543
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
SputnickskyANAпропущено...
Ни фига не понял.

" При входе в запись идет выборка значений с табл "записи" " - это что значит?

Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи?
Плюс выполняется UPDATE одной строки по этому же идентификатору?

ИМХО можно это в хранимку занести.

Приведите структуру таблицы "записи" и конкретные выполняемые запросы. Какие индексы на таблице созданы?

Пользователь кликает на ссылку для просматра конкретной записи. Из БД выбираются поля данной записи по идентификатору записи?
Плюс выполняется UPDATE одной строки по этому же идентификатору?
--
да.

Таблица "записи"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE [dbo].[Records] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [Title] nvarchar(150) COLLATE Ukrainian_CI_AS NOT NULL,
  [Text] nvarchar(max) COLLATE Ukrainian_CI_AS NOT NULL,
  [Type] int NOT NULL,
  [Category] int NULL,
  [DateTimePublish] datetime NOT NULL,
  [DateTimeActivate] smalldatetime NULL,
  [User_id] int NOT NULL,
  [is_publish] bit CONSTRAINT [DF_Records_is_publish] DEFAULT 0 NOT NULL,
  [PathThumbnail] nvarchar(50) COLLATE Ukrainian_CI_AS NULL,
  [Anonse] nvarchar(150) COLLATE Ukrainian_CI_AS NULL, 
  [Approve] bit NULL,
  [Deleted] bit DEFAULT 0 NULL,
  [Views] int NULL, 
  [Uniq] bit DEFAULT 0 NOT NULL,
   varchar(300) COLLATE Ukrainian_CI_AS NULL,
  [Section] int DEFAULT 5 NOT NULL,
  [CommentsOpen] bit DEFAULT 1 NOT NULL,
  CONSTRAINT [PK_Records] PRIMARY KEY CLUSTERED ([id]),
  CONSTRAINT [FK_Records_CategoriesRecord] FOREIGN KEY ([Category]) 
  REFERENCES [dbo].[CategoriesRecord] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [FK_Records_TypesRecord] FOREIGN KEY ([Type]) 
  REFERENCES [dbo].[TypesRecord] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION,
  CONSTRAINT [FK_Records_Users] FOREIGN KEY ([User_id]) 
  REFERENCES [dbo].[UserProfile] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)


Таблица СЕО
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE [dbo].[SEO] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [id_record] int NOT NULL,
  [Title] varchar(150) COLLATE Ukrainian_CI_AS NULL,
  [Keywords] varchar(150) COLLATE Ukrainian_CI_AS NULL,
  [Description] varchar(250) COLLATE Ukrainian_CI_AS NULL,
  [Direct] bit NULL,
  PRIMARY KEY CLUSTERED ([id]),
  UNIQUE ([id_record]),
  CONSTRAINT [SEO_fk_record] FOREIGN KEY ([id_record]) 
  REFERENCES [dbo].[Records] ([id]) 
  ON UPDATE NO ACTION
  ON DELETE NO ACTION
)


Выборка одиночной записи + апдейт кол-ва просмотров (поле [Views]):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
 public Record GetRecordById(int id_record, bool? ViewPlus = false) 
        {          


            if (db == null) { db = new T_DLL.Model.TDBEntities(); }
			
            //возвращаем 1 дб объект
            var record = (from rec in db.Records
                           join usr in db.UserProfiles on rec.User_id equals usr.id
                           join typ in db.TypesRecord on rec.Type equals typ.id
                           join cat in db.CategoriesRecord on rec.Category equals cat.id
                           join seo_source in db.SEOs on rec.id equals seo_source.id_record 
                           into t1
                           from seo in t1.DefaultIfEmpty()
                           where rec.id == id_record && rec.Deleted == false
                           select new { record = rec, user = usr, TypeName = typ, PathImgCategory = cat, seo = seo }).FirstOrDefault();
          
           
              //УВЕЛИЧИМ ПРОСМОТР ЕСЛИ ИСТИНА
            if (ViewPlus == true)
            {
                ViewPlusM(record.record.id);                 
            }
                 
            return   MapToRecordsBLLseo(record.record, record.user, record.TypeName, record.PathImgCategory, record.seo); 
        }

        public void ViewPlusM(int id_record) 
        {                   
                using (var db = new T_DLL.Model.TDBEntities())
                {
                    string sql = "update Records set Views = @Views_Now where id = @id_rec";
                    
                    List<System.Data.SqlClient.SqlParameter> parameterList = new List<System.Data.SqlClient.SqlParameter>();

                    parameterList.Add(new System.Data.SqlClient.SqlParameter("@id_rec", id_record));                  
                  
                    System.Data.SqlClient.SqlParameter[] parameters = parameterList.ToArray();

                    int result = db.Database.ExecuteSqlCommand(sql, parameters);                     

       }


процедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dbo.AddView @id_rec int
AS
BEGIN

update Records
SET     Views = Views + ABS(Checksum(NewID()) % 3) + 2 
where  id = @id_rec

END


В запросе JOIN 5 таблиц, индексы на внешние ключи есть? План запроса смотрели?

Sputnick----
думаю нужно для поля [DateTimePublish] datetime NOT NULL, индекс тоже сделать, так как в архиве по дате выборка идет очень долго.
Тут не гадать надо, а план выполнения смотреть.
...
Рейтинг: 0 / 0
08.10.2015, 10:05
    #39071571
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANAПро кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :)

неправда!

https://www.nuget.org/packages/EntityFramework.Cache
...
Рейтинг: 0 / 0
08.10.2015, 10:10
    #39071583
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVosttskyANAПро кэш второго уровня он говорит. У EF6 с этим проблемы, тупо не поддерживает, надо самому пилить :)

неправда!

https://www.nuget.org/packages/EntityFramework.Cache Какой-то moozzyk запилил типа Second Level Cache for Entity...
Выложил в NuGet больше года назад, обновлений с тех пор не было.

И ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает.
...
Рейтинг: 0 / 0
08.10.2015, 10:13
    #39071587
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANAИ ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает.

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

https://efcache.codeplex.com/

я утверждаю, что поддержка 2LC есть, но нет собственной реализации, а это скорее плюс, чем минус. так неизвестно, какое именно кеширование нужно именно тебе, а для всех не угадаешь.
...
Рейтинг: 0 / 0
08.10.2015, 14:52
    #39072018
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVosttskyANAИ ты предлагаешь этим пользоваться в продакшн? ИМХО лучше самостоятельно запилить под свои нужды, оттестировать, счётчики навесить и знать как оно работает.

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

https://efcache.codeplex.com/

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

Output Cache в ASP.NET можно тупо заюзать, а можно реализовать свой CustomCacheProvider.
Подобный подход и в NHibernate: Chapter 25. NHibernate.Caches .

А в EF этого нет. А то что поверх можно навернуть, так это понятно.
...
Рейтинг: 0 / 0
08.10.2015, 14:58
    #39072025
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVostt, ты кстати сам-то код https://efcache.codeplex.com/ смотрел? Что-то ничего кроме InMemory кэша я там не увидел.
...
Рейтинг: 0 / 0
08.10.2015, 18:44
    #39072307
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANAА в EF этого нет. А то что поверх можно навернуть, так это понятно.

ну точка есть, куда можно кеш воткнуть и ладно :)

в хибере просто есть дополнительная инфраструктура, типа реализуешь провайдер и всё такое.

кстати, по опыту, проекты на хибере реал сложнее в разработке и поддержке, чем на EF, при чём ощутимо. это связано с тем, что хибер слишком дофига сложный — да, умеет больше, чем EF, но из-за этого все порой покрывается слоем из граблей.

самое важное отличие, наверное, это что EF это чистый UOW, а хибер -- вообще ни разу.
...
Рейтинг: 0 / 0
08.10.2015, 18:44
    #39072308
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANAhVostt, ты кстати сам-то код https://efcache.codeplex.com/ смотрел? Что-то ничего кроме InMemory кэша я там не увидел.

ну простецки же всё :)
...
Рейтинг: 0 / 0
08.10.2015, 19:02
    #39072332
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
hVosttskyANAА в EF этого нет. А то что поверх можно навернуть, так это понятно.

ну точка есть, куда можно кеш воткнуть и ладно :)

в хибере просто есть дополнительная инфраструктура, типа реализуешь провайдер и всё такое.

кстати, по опыту, проекты на хибере реал сложнее в разработке и поддержке, чем на EF, при чём ощутимо. это связано с тем, что хибер слишком дофига сложный — да, умеет больше, чем EF, но из-за этого все порой покрывается слоем из граблей.

самое важное отличие, наверное, это что EF это чистый UOW, а хибер -- вообще ни разу.Честно, с хибером никаких граблей не испытываю.

Вообще на Dapper надо переходить :)
...
Рейтинг: 0 / 0
08.10.2015, 19:20
    #39072344
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация ASP MVC сайта (структура БД)
skyANAЧестно, с хибером никаких граблей не испытываю.

а я испытываю. лично меня бесит (в порядки убывания):

1. отвратительная поддержка LINQ (сложные подзапросы с аггрегациями? параметризованные подзапросы? досвидания)
2. сложный многобуквенный маппинг, либо костыль-нашлёпка
3. отсутствие асинка (мы проводили опыт не небольшом проекте, перевели с гибера на EF + async и на массированных селениум-тестах получили увеличение производительности на 20-30%)

т.е. мои любимые проекции с хибером часто тупо пролетают. поэтому не рекомендую никому. по сути я с ним имею дело только на проектах, которые не я начинал, и которые висят на поддержке.

хотя сам по себе хибер очень даже позволяет делать мощные и сложные ПО, только надо быть аккуратней и отказаться от некоторых прелестей EF.

skyANAВообще на Dapper надо переходить :)

мне пока не встречалось таких задач, где даппер был бы в тему
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Оптимизация ASP MVC сайта (структура БД) / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]