SqlClient CacheBufferSize - свойствоNemiro.Data.dll
Максимальный объем данных (в килобайтах) для дополнительного кэша в памяти (ОЗУ) компьютера. Кэш памяти используется для ускорения работы файлового кэша (File). Значение по умолчанию 2048 Кб (2 Мб).

Пространство имён: Nemiro.Data.Sql
Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Синтаксис

public long CacheBufferSize { get; set; }

Значение свойства

Тип: Int64
Заметки

Буфер используется, только если свойство CacheType имеет значение File.

Как правило, параметры кэширования указывается один раз в файле конфигурации. Объем памяти вспомогательного кэша устанавливается в параметре NeData:Sql:CacheBufferSize (для веб-приложений) или в параметре NeDataSqlCacheBufferSize (для приложений Windows).

<appSettings> 
  <clear /> 
  <!--Метод кэширования данных--> 
  <add key="NeData:Sql:CacheType" value="File" /> 
  <!--Каталог хранения файлов кэша--> 
  <add key="NeData:Sql:CachePath" value="C:\cache\MyApplication" /> 
  <!--Объем буфера файлового кэша 50 Мб (50 Мб * (1 Мб = 1024 Кб) = 51 200 Кб)--> 
  <add key="NeData:Sql:CacheBufferSize" value="51200" /> 
</appSettings>

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

Не рекомендуется менять объем буфера программно, лучше указать его один раз в файле конфигурации приложения.

Буфер реализован на основе коллекции Hashtable.

При использовании кэша в многопоточных приложениях, буфер, на момент записи в него данных, блокируется. Время блокировки не может превышать CacheBufferAccessTimeout. Блокировка необходима для решения известных проблем с доступом к Hashtable при очень большом количестве асинхронных запросов. Речь об исключении: InvalidOperationException: Hashtable insert failed. Load factor too high. The most common cause is multiple threads writing to the Hashtable simultaneously. Если у вас возникнут проблемы в работе кэша: излишние задержки, или может даже показанное выше исключение, то отключите буфер, установив значение 0. Но как показывает практика, в обычных условиях проблем в работе буфера не возникает. Механизм блокировки был сделан специально для веб-сайтов, в которых может производиться одновременно множество запросов к одним и тем же данным.

Примеры

В следующем примере показано программное изменение размера буфера файлового кэша. Это может иметь смысл, только если требуется выполнить большую серию запросов в рамках срока жизни экземпляра класса SqlClient, где необходим кэш.

using (SqlClient client = new SqlClient())
{
  // кэширование результатов в файлом кэше на 20 минут
  client.CacheDuration = 1200; // 20 минут * 60 секунд = 1 200 секунд
  client.CacheType = CachingType.File;
  // объем буфера файлового кэша - 100 Мб
  client.CacheBufferSize = 102400;
  // формирование запроса
  client.CommandText = "SELECT * FROM users";
  // выполнение запроса 
  var table = client.GetTable();
  // вывод результатов
  Console.WriteLine("Получено данных: {0}", table.Rows.Count);
  Console.WriteLine("Время выполнения запроса: {0}", client.LastQueryTime);
  Console.WriteLine("Результат получен из кэша: {0}", client.LastQueryResultsFromCache);
}
См. также