Сборка: Nemiro.Data (в Nemiro.Data.dll) Версия: 2.11.4.126 (2.11.4.126)
Значение свойства
Тип: 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); }