Доступ к данным и уровни сохранения / хранения являются неотразимо естественными местами для кэширования. Они делают ввод / вывод, делая их удобными, легкими для вставки кэширования. Я осмелюсь сказать, что почти каждому DAL или персистентному слою по мере его развития будет предоставлена функция кэширования - если он не был спроектирован таким образом с самого начала.
Проблема в намерениях . Уровни DAL и персистентности имеют дело с относительно низкоуровневыми конструкциями - например, с записями, таблицами, строками и блоками. Они не видят «бизнес» или объекты уровня приложения, или не имеют большого понимания того, как они используются на более высоких уровнях. Когда они видят несколько строк или дюжину читаемых или записываемых блоков, не ясно, что они представляют. «Учетная запись Jones, которую мы сейчас анализируем», не сильно отличается от «некоторых базовых справочных данных по ставке налогообложения, которые нужны приложению только один раз и к которым оно больше не будет ссылаться». На этом уровне данные есть данные есть данные.
Кэширование на уровне DAL / персистентности может привести к тому, что «холодные» справочные данные о налогах окажутся там, бесполезно занимая 12,2 МБ кеша и вытесняя некоторую информацию об учетной записи, которая, фактически, будет интенсивно использоваться в течение минуты. Даже самые лучшие менеджеры кэша имеют дело со скудными знаниями о структурах данных и соединениях более высокого уровня, и мало понимают, какие операции будут происходить в ближайшее время, поэтому они прибегают к алгоритмам угадывания .
В отличие от этого, кэширование на уровне приложений или на уровне бизнеса не так уж и аккуратно. Это требует вставки операций управления кешем или подсказок в середине другой бизнес-логики, что делает бизнес-код более сложным. Но компромисс заключается в следующем: имея больше знаний о том, как структурированы данные на макроуровне и какие операции выполняются, у него гораздо лучшая возможность приблизить оптимальную («ясновидящая» или «беладийская») эффективность кэширования.
То, имеет ли смысл вставлять ответственность за управление кэшем в код бизнеса / приложения, зависит от решения и будет зависеть от приложений. Во многих случаях, хотя известно, что слои DAL / постоянство не получат его «совершенно правильно», компромисс заключается в том, что они могут сделать довольно хорошую работу, что они делают это «архитектурно» чистым и гораздо более интенсивно тестируемым способом и этот низкоуровневый перехват позволяет избежать усложнения кода бизнес / приложения.
Меньшая сложность способствует более высокой точности и надежности, а также сокращает время выхода на рынок. Это часто считается хорошим компромиссом - менее совершенное кэширование, но более качественный и более своевременный бизнес-код.