Распределенное кеширование с помощью Entity Framework
Entity Framework — это набор технологий в ADO.NET, которые поддерживают разработку программных приложений, ориентированных на данные. С Entity Framework разработчики могут работать на более высоком уровне абстракции, когда имеют дело с данными, и могут создавать и поддерживать ориентированные на данные приложения с меньшим количеством кода, чем в традиционных приложениях.
NCache представляет поставщика кэширования, который действует между Entity Framework и источником данных. Основная причина, лежащая в основе поставщика EF Caching, заключается в том, чтобы уменьшить количество обращений к базе данных (что снижает производительность приложений) и обслуживать результат запроса из кэша. Поставщик действует между структурой сущности ADO.NET и исходным источником данных. Следовательно, поставщик кэширования может быть подключен без изменения / компиляции текущего кода.
Вам также может понравиться:
Entity Framework (EF) Core Cache
Режимы интеграции
Поставщик кэширования NCache Entity Framework работает в двух режимах. Это может быть либо в режиме « Кэширование », либо в режиме « Анализ ». В режиме кэширования вы можете кэшировать набор результатов выбранных запросов. Режим анализа работает в сквозном режиме и помогает вам находить запросы, которые следует кэшировать, создавая отчет, показывающий, какие запросы вызываются с какой периодичностью.
Синхронизация базы данных
Поставщик NCache Entity Framework также гарантирует, что данные в кэше всегда синхронизируются с базой данных. Поэтому NCache использует .NET SqlCacheDependeny, который регистрирует запрос SQL на SQL Server, поэтому, если в базе данных изменяется какая-либо строка в наборе данных, представленном этим запросом, SQL Server отправляет уведомление о событии в NCache. Затем NCache удаляет соответствующий набор результатов из кэша.
Как интегрировать NCache с Entity Framework
Предпосылки
1. У вас должно быть приложение Entity Framework. (Вы также можете использовать пример приложения для EFCaching из примеров приложений NCache по следующему пути:
«Installeddirectory: / ProgramFiles / NCache / samples / clr20 / EntityDataModelIntegrationDemo»)
В каждое приложение Entity Framework уже добавлена модель данных объекта ADO.NET, которая автоматически создает два файла:
- SSDL
- Файл конфигурации приложения (или сети)
2. Microsoft Visual Studio 2010 для Entity Framework 3.5 и 4.0 и Microsoft Visual Studio 2012/2013 для Entity Framework 6.0 и 6.1
3. Инструмент базы данных (например, MS SQL SERVER 2008, ORACLE)
Шаги для включения кэширования NCache
Шаг 1: Добавить ссылку
Добавьте Alachisoft.Integrations.EntityFramework.CachingProvider
ссылку на ваше приложение Entity Framework. Этот файл .dll находится по следующему пути:
« Installeddirectory: / ProgramFiles / NCache / интеграции / MSEntityFramework »
После добавления ссылки, изменения необходимы в 3 разных файлах.
Шаг 2. Конфигурации SSDL (для Entity Framework 3.5 и 4.0)
В файле SSDL, который создается при добавлении ADO.NET Entity Data Model в приложение Entity Framework, необходимы следующие изменения:
Ниже приведены примеры изменений для базы данных SQL 2008.
В SSDL имя поставщика указывается в атрибуте Provider элемента <Schema />, как показано ниже:
[Существующий код]
<Schema Namespace = "NorthwindModel.Store" Alias = "Self" Provider = "System.Data.SqlClient" ProviderManifestToken = "2005"
xmlns:store ="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns ="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
Чтобы внедрить нашего провайдера NCache Entity Framework, нам нужно переопределить вышеуказанные атрибуты, чтобы подключить нашего провайдера. В SSDL мы указываем имя нового поставщика в атрибуте Provider и объединяем предыдущего поставщика с токеном манифеста нашего поставщика в поле ProviderManifestToken , как показано ниже:
[Измененный код]
<Schema Namespace = "NorthwindModel.Store" Alias = "Self"
Provider = "Alachisoft.Integrations.EntityFramework.CachingProvider"
ProviderManifestToken = "System.Data.SqlClient;2005"
xmlns:store = "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns = "http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
Шаг 3. Конфигурации приложений (или веб-сайтов)
Файл конфигурации приложения (или веб-приложения), который создается при добавлении модели данных Entity ADO.NET в приложение Entity Framework, требует следующих изменений:
Entity Framework 3.5 и 4.0
- Имя инварианта провайдера указывается в строке подключения приложения или файла веб-конфигурации:
<connectionStrings> <add name="NorthwindEntities" connectionString="metadata=res://*/NorthwindCustomerModel.csdl |res://*/NorthwindCustomerModel.ssdl |res://*/NorthwindCustomerModel.msl; provider=System.Data.EntityClient; provider connection string=" Data Source=localhost;Initial Catalog=Northwind;user id= userid; password=password;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/> </connectionStrings>
- Измените имя поставщика на NCache Entity Framework Provider, а также добавьте информацию об оболочке поставщика в строку подключения, как показано ниже:
<connectionStrings> <add name="NorthwindEntities" connectionString="metadata=res://*/NorthwindCustomerModel.csdl |res://*/NorthwindCustomerModel.ssdl |res://*/NorthwindCustomerModel.msl; provider=Alachisoft.Integrations.EntityFramework.CachingProvider; provider connection string=" wrappedProvider=System.Data.SqlClient; Data Source=localhost;Initial Catalog=Northwind;user id= userid; password=password;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/> </connectionStrings>
- Также добавьте фабрику провайдеров для инициализации NCache Entity Framework Provider. Атрибут invariant должен совпадать с именем поставщика в строке подключения.
-
<DbProviderFactories> <add name="EF Caching Data Provider" invariant="Alachisoft.Integrations.EntityFramework. CachingProvider" description="Caching Provider Wrapper" type="Alachisoft.NCache.Integrations. EntityFramework.EFCachingProviderFactory, Alachisoft.Integrations.EntityFramework. CachingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cff5926ed6a53769"/> </DbProviderFactories>
Entity Framework 6.0
- Имя инварианта провайдера также указывается в файле конфигурации приложения (или сети):
<entityFramework> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
- Измените имя инварианта на
EFCachingProviderServices
и введитеAlachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices,
Alachisoft.Integrations.EntityFramework.CachingProvider
как показано ниже: -
<entityFramework> <providers> <provider invariantName="EFCachingProviderServices" type="Alachisoft.NCache.Integrations.EntityFramework.EFCachingProviderServices, Alachisoft.Integrations.EntityFramework.CachingProvider" /> </providers> </entityFramework>
Entity Framework 6.1
- Добавьте перехватчик в разделе провайдера в файле конфигурации приложения (или веб-сайта):
<entityFramework> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> <interceptors> <interceptor type="Alachisoft.NCache.Integrations.EntityFramework.Caching.EFCommandInterceptor, Alachisoft.Integrations.EntityFramework.CachingProvider" /> </interceptors> </entityFramework>
- Следующая информация должна быть добавлена в appSettings of
app.config/web.config
:<appSettings> <add key = "app-id" value = "PersonNameApp2"/> <add key = "logging-level" value = "Debug"/> </appSettings>
- App-id : это будет идентификатор текущего приложения. Этот идентификатор будет использоваться для чтения конфигураций из efcaching.ncconf
- Уровень ведения журнала. Определите уровень ведения журнала для приложения. Наш провайдер будет регистрировать исключения и ошибки только в том случае, если для уровня установлено значение Ошибка . Когда уровень установлен на Debug, будут регистрироваться как исключения / ошибки, так и другая подробная информация. Ничего не будет зарегистрировано, если уровень установлен на Off (по умолчанию). Путь, по которому будут создаваться файлы журналов: По умолчанию = <install-dir> <install-dir> / log-files / efcaching-logs /
- Для применения вышеуказанных изменений, приложение должно быть перезапущено после внесения этих изменений
ПРИМЕЧАНИЕ. Идентификатор приложения для efcaching.ncconf должен быть таким же, как и в приложении (app.config), в противном случае появится сообщение об ошибке)
Альтернативный метод
Entity Framework 3.5 или 4.0
Помимо указания строки подключения в app.config / web.config, подключение также можно указать при создании ObjectContext
или EntityConnection
. При программном создании строки подключения информация об оболочке должна быть включена в строку подключения. Вот как строка соединения может быть создана и / ObjectContext
или EntityConnection
может быть инициализирована.
try
{
SqlConnectionStringBuilder sqlConnBuilder = new SqlConnectionStringBuilder();
sqlConnBuilder.DataSource = "localhost";
sqlConnBuilder.InitialCatalog = "EFTestDB";
sqlConnBuilder.IntegratedSecurity = true;
string conString = sqlConnBuilder.ToString();
EntityConnectionStringBuilder efConnBuilder = new EntityConnectionStringBuilder();
efConnBuilder.Provider = "EFCachingProvider";
efConnBuilder.ProviderConnectionString = @"wrappedProvider=System.Data.SqlClient;" + conString;
efConnBuilder.Metadata = "res:// /NorthwindCustomerModel.csdl|res:" + "// /NorthwindCustomerModel.ssdl|res:" +"// /NorthwindCustomerModel.msl;";
EntityConnection connection = new EntityConnection(efConnBuilder.ToString());
}
catch (Exception ex)
{
// handle exception
}
Entity Framework 6.0
Помимо указания инварианта провайдера в app.config / web.config, инвариант провайдера может быть указан при инициализации конфигурации (класс, наследующий DbConfiguration). Вот как можно указать инвариант провайдера:
try
{
this.SetProviderServices("EFCachingProviderServices", EFCachingProviderServices.Instance);
}
catch (Exception ex)
{
// handle exception
}
Entity Framework 6.1
Помимо указания перехватчика базы данных в app.config / web.config, перехватчик базы данных может быть указан при инициализации конфигурации (класс, наследующий DbConfiguration). Вот как можно указать перехватчик:
try
{
this.AddInterceptor(new EFCommandInterceptor());
}
catch (Exception ex)
{
// handle exception
}
Через API (6.0 и 6.1)
Теперь пользователь также может кэшировать результаты, используя расширение, предусмотренное для IQueryable
.
- Укажите пространство имен
-
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
- Метод кеша вызовов теперь перегружается из
IQueryable
экземпляра
var students = from s in db.Students
select s;
students.Cache();
// results are not cached yet
foreach (Student student in students)
//results are cached when enumerator from query is iterated completely
{
//using student
}
Шаг 4: Конфигурации efcaching.ncconf
Требуются изменения в «efcaching.ncconf».
- Efcaching.ncconf находится по следующему пути: «Установленный каталог: / Program Files / NCache / config».
- Конфигурация провайдера содержит информацию о кеше и политике кэширования. Ниже приведены необходимые изменения в файле efcaching.ncconf.
<configuration> <app-config app-id = "PersonNameApp" mode = "analysis|caching">
- Режим «Анализ» используется для мониторинга количества выполнений каждого запроса, а затем генерирует отчет. Отчет содержит текст запроса и количество вызовов для каждого запроса. Этот отчет может быть использован в пользовательской политике. В этом режиме кэширование не выполняется.
<analysis-policy log-path = "" analysis-time = "1min" cache-enable-threshold = "1" default-expiration-type = "Sliding" default-expiration-time = "180sec" dbsyncdependency= "false"/>
- Log-path: путь, по которому будут сгенерированы файлы журнала анализа. По умолчанию = <install-dir> / log-files / efcaching-analysis-logs /
- В режиме «Кэширование» поставщик упаковки будет кэшировать результаты всех указанных запросов. Обе политики имеют свои собственные спецификации. Всякий раз, когда в соответствующей базе данных обнаруживается обновление (либо UPDATE, INSERT, либо DELETE), провайдер делает недействительными записи в кэше, на которые влияют, путем удаления всех кэшированных запросов, которые зависели от любой из обновленных таблиц.
<cache-policy-configuration database = "none|sqlserver|oracle" cache-id = "mycache">
- Для настраиваемой политики он включает настраиваемый пользователем список запросов, которые должны кэшироваться вместе с их результатами. Будут кэшироваться только те результаты запроса, для которых включено кэширование. Вы можете указать собственную политику кэширования для всех запросов.
<!--sql-query = "SELECT [Extent1].[CustomerID] AS [CustomerID],= @param_0"--> <query> <cache-query query text="SELECT [Extent1].[OrderID] AS [OrderID], < @param_0"/> <cache-policy vary-by-cache-param="param_0" expiration-type="Sliding" enabled="True" expiration-time="180sec" dbsyncdependency="False"/> </query>
- В случае хранимых процедур, текст запроса будет именем хранимой процедуры, и не будет никакой политики по умолчанию или зависимости синхронизации базы данных. Пользователь может кэшировать результат хранимых процедур только с истечением срока действия, здесь не требуется никакой зависимости от базы данных.
- В случае кэширования на уровне API (поддерживается в Entity Framework 6.0 и 6.1) вы можете кэшировать запрос, используя метод расширения, предоставленный в пространстве имен,
using Alachisoft.NCache.Integrations.EntityFramework.Caching;
и вы можете предоставить политику кэширования для кэширования на уровне API в файле конфигурации в следующем теге:<api-level-caching expiration-type="sliding|absolute" enable="True|False" expiration-time="120sec" dbsyncdependency="True|False">
Дальнейшее чтение
Использование .NET Caching в EF Core с помощью методов расширения [Видео]