Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Значение свойства
Тип: TypeПользовательский класс, реализующий доступ к кэшу, должен быть наследован от ObjectCache.
Чтобы использовать пользовательский класс для работы с кэшем, свойство CacheType должно иметь значение Custom.
Как правило, метод кэширования указывается один раз в файле конфигурации, в параметре NeData:Sql:CacheType (для веб-приложений) или в параметре NeDataSqlCacheType (для приложений Windows).
<appSettings> <clear /> <!--Метод кэширования данных--> <add key="NeData:Sql:CacheType" value="Custom" /> <!--Имя типа пользовательского кэша--> <add key="NeData:Sql:CacheCustom" value="MyCache" /> <!--Список дополнительных параметров (через запятую), которые будут переданы в конструктор пользовательского кэша--> <add key="NeData:Sql:CacheCustomArgs" value="1,test,123" /> </appSettings>
Работа реализации пользовательских механизмов кэширования на данный момент не проверена и не гарантируется.
В следующем примере программно устанавливается пользовательский метод кэширования данных и выполняется запрос к SQL Server методом GetTable с кэшированием результатов на 60 секунд.
using (SqlClient client = new SqlClient()) { // кэширование результатов в файлом кэше на 60 секунд client.CacheDuration = 60; // устанавливаем пользовательский тип кэширования client.CacheType = CachingType.Custom; // указываем пользовательский тип кээширования client.CacheCustom = typeof(MyCache); // формирование запроса client.CommandText = "SELECT * FROM messages"; // выполнение запроса var table = client.GetTable(); // вывод результатов Console.WriteLine("Получено данных: {0}", table.Rows.Count); Console.WriteLine("Время выполнения запроса: {0}", client.LastQueryTime); Console.WriteLine("Результат получен из кэша: {0}", client.LastQueryResultsFromCache); }
Ниже показан пример реализации класса пользовательского кэша на C#. Это копия кода класса WebCache.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Caching; using System.Web; public class MyCache : ObjectCache { private System.Web.Caching.Cache _Instance = null; // Политика кэширования по умолчанию. public CacheItemPolicy DefaultPolicy { get; set; } public WebCache() { if (HttpContext.Current != null) { _Instance = HttpContext.Current.Cache; this.DefaultPolicy = new CacheItemPolicy(); } else { throw new Exception("HttpContext is requred."); } } public WebCache(HttpContext context) { _Instance = context.Cache; this.DefaultPolicy = new CacheItemPolicy(); } // Вставляет запись в кэш, используя указанную пару "ключ-значение" и заданные сведения о методе ее удаления. public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null) { object result = _Instance[key]; _Instance.Add(key, value, null, policy.AbsoluteExpiration.DateTime, policy.SlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null); return result; } // Добавляет запись в кэш, используя заданный экземпляр CacheItem и сведения о способе удаления записи. public override CacheItem AddOrGetExisting(CacheItem value, CacheItemPolicy policy) { object result = this.AddOrGetExisting(value.Key, value.Value, policy, value.RegionName); if (result == null) { return null; } return new CacheItem(value.Key, result, value.RegionName); } // Добавляет запись в кэш, используя заданную пару "ключ-значение" и абсолютное значение срока действия. public override object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null) { CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = absoluteExpiration; return this.AddOrGetExisting(key, value, policy, regionName); } // Определяет, существует ли в кэше запись кэша. public override bool Contains(string key, string regionName = null) { return _Instance[key] != null; } // При переопределении в производном классе создает объект CacheEntryChangeMonitor, который может активировать события в ответ на изменения указанных записей кэша. public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null) { throw new NotImplementedException(); } // Содержит описание функций, предоставляемых реализацией кэша. public override DefaultCacheCapabilities DefaultCacheCapabilities { get { return DefaultCacheCapabilities.AbsoluteExpirations | DefaultCacheCapabilities.SlidingExpirations; } } // Получает из кэша указанную запись кэша в виде объекта. public override object Get(string key, string regionName = null) { return _Instance.Get(key); } // Получает из кэша указанную запись кэша в виде экземпляра CacheItem. public override CacheItem GetCacheItem(string key, string regionName = null) { return new CacheItem(key, this.Get(key, regionName), regionName); } // Получает общее число записей в кэше. public override long GetCount(string regionName = null) { return _Instance.Count; } // Создает перечислитель, который может использоваться для перебора записей кэша в коллекции. protected override IEnumerator<KeyValuePair<string, object>> GetEnumerator() { List<KeyValuePair<string, object>> result = new List<KeyValuePair<string, object>>(); System.Collections.IDictionaryEnumerator em = _Instance.GetEnumerator(); while (em.MoveNext()) { result.Add(new KeyValuePair<string, object>(em.Key.ToString(), em.Value)); } return result.GetEnumerator(); } // Получает набор записей кэша, соответствующих указанным ключам. public override IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = null) { Dictionary<string, object> result = new Dictionary<string, object>(); foreach (string key in keys) { result[key] = this.Get(key, regionName); } return result; } // Имя экземпляра. public override string Name { get { return "ASP .NET"; } } // Удаляет запись из кэша. public override object Remove(string key, string regionName = null) { return _Instance.Remove(key); } // Вставляет запись в кэш в виде экземпляра CacheItem и задает сведения о способе удаления записи. public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null) { base.Add(key, value, policy, regionName); } // Вставляет запись в кэш в виде экземпляра CacheItem и задает сведения о способе удаления записи. public override void Set(CacheItem item, CacheItemPolicy policy) { base.Add(item, policy); } // Вставляет запись в кэш. public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null) { base.Add(key, value, absoluteExpiration, regionName); } public override object this[string key] { get { return this.Get(key, null); } set { this.Set(key, value, this.DefaultPolicy, null); } } }