Я использую Massive micro-ORM в новом проекте. Я добавил немного кэширования, и все, казалось, работало, пока я не понял, что кэшированные объекты (динамические) все еще запрашивают базу данных. Это убивает весь смысл кэширования.
Какой самый простой способ отключить результирующий набор от базы данных. Почти все вызовы доступны только для чтения.
Я использую такой код для запроса записей:
public static dynamic GetActive()
{
return Caching.LoadFromCache("Units_GetActive", 120,
() =>
{
dynamic tbl = new Units();
return tbl.Find(Enabled: 1, orderby: "SortOrder");
});
}
Мой код кэширования выглядит так:
public static dynamic LoadFromCache(string cacheKey, int secondsToCache, Func<object> query)
{
object tocache = null;
// result will always get the value here
// tocache will only have the value when it was pulled from our method
object result = MemoryCache.Default[cacheKey] ?? (tocache = query.Invoke());
if (secondsToCache > 0)
{
if (tocache != null) // only save to cache if it wasn't there
MemoryCache.Default.Add(cacheKey, tocache, DateTime.UtcNow.AddSeconds(secondsToCache));
}
else
{
// remove from cache only if secondsToCache was zero or less
MemoryCache.Default.Remove(cacheKey);
}
return result;
}
Код кэширования работает. Проблема в том, что возвращенный динамический объект (IEnumerable<dynamic>
) открывает другое соединение с базой данных.
Идеи?
ToList()
), чтобы он не пересчитывался каждый раз, когда он используется. - person Tim Medora   schedule 09.05.2014