Ссылка .NET на кешированный элемент (DataTable) - PullRequest
3 голосов
/ 06 октября 2011

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

Сценарий прост.Я храню результаты запроса к БД в DataTable и помещаю их в этот кеш.После выполнения запроса к БД или получения результатов из кэша мне нужно выполнить некоторые пост-манипуляции с ним (например, добавить столбец или упорядочить).Кажется, что манипуляция происходит с элементом в кеше.Поэтому, когда я беру элемент из кэша, он должен получить ссылку на него?

Код

string CacheKey = "SearchData";
DataTable CachedResults = null;
object CachedObject = Cache[CacheKey];
if (CachedObject is DataTable) { CachedResults = (DataTable)CachedObject; }
if (CachedResults == null)
{
  CachedResults = new DataTable();
  // Query the database and fill CachedResults

  if (Cache[CacheKey] == null)
  {
    Cache.Add(CacheKey, CachedResults, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration, CacheItemPriority.Low, null);
  }

}

CachedResults.Columns.Add("NewColumn");

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

Большое спасибо, Малекс

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

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

Если, однако, вы используете что-то вроде sql-сервера в качестве бэкэнда для кэша, он будет сериализован и десериализован.

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

В вашем конкретном случае, да: копирование DataTable после выборки позволит избежать этой проблемы.

1 голос
/ 06 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...