Лучший способ кэширования таблиц поиска БД?
Эй Ребята,
Я ищу лучший способ кэширования таблиц поиска БД, которые состоят примерно из 75 таблиц.
Я хочу кэшировать данные этих таблиц, чтобы использовать их в своем приложении, поэтому я не буду открывать соединение с БД каждый раз, когда они мне нужны.
Итак, вот что я делаю:
1-я создал I статический класс, содержащий статические свойства для каждой таблицы поиска под названием (MyApplicatioCache).
2 - каждое свойство в (get) я заполняю предполагаемыми данными из БД.
3-Поместите результат в HttpRuntime.Кэш["Имя_свойства"]
4-каждый раз, когда я ПОЛУЧИТЬ в этой таблице поиска данных я делаю проверку, если HttpRuntime.Кэш["Имя_свойства"] Не равно нулю.
5 - если да, то я получаю его от cahce, иначе я получаю его от DB
6-наконец, я вызываю все свойства в событии запуска приложения в global. asax
До сих пор все хорошо но недавно я столкнулся с проблемой производительности и не могу ее решить:
если я хочу, чтобы объект кэша (плательщик) обновлялся из БД, я делаю это:
MyApplicationCache.Payer = null; / / устанавливает HttpRuntime.Cache ["Payer"] = null, поэтому, если я запросил его снова, он перезагружается из БД.
list<payer> payerList = MyApplicationCache.Payer;
Теперь возникает проблема производительности:
1-PayerList в БД - это около 1700 записей.
2 - каждый объект плательщика имеет свойство списка под названием PayerBranches, которое требует зацикливания на всех списках плательщиков и получения плательщиков для каждого элемента списка плательщиков.
// MyApplicationCache Свойство Плательщика:
public static List<LDM.DataEntityTier.Payer> Payer { get { if (HttpRuntime.Cache["Payer"] != null) return (List<LDM.DataEntityTier.Payer>)HttpRuntime.Cache["Payer"]; else { // request item from its original source using (LDM.DataAccess.OracleManager OracleManager = new LDM.DataAccess.OracleManager()) { OracleManager.OpenConnection(); List<LDM.DataEntityTier.Payer> result = new LDM.DataService.PayerService().GetPayersListWithFullName(3, OracleManager, "UTC"); //List<LDM.DataEntityTier.Payer> result = new LDM.DataService.PayerService().GetListOfPayer("Order by Name asc", OracleManager ,"UTC"); List<PayerBranches> payerBranchesList = new LDM.DataService.PayerBranchesService().GetListOfObject(OracleManager, "UTC"); OracleManager.CloseConnection(); foreach (Payer payerItem in result) { payerItem.PayerBranches = new List<PayerBranches>(); foreach (PayerBranches item in payerBranchesList.FindAll(x => x.PayerID == payerItem.Id)) { payerItem.PayerBranches.Add(item); } } // add item to cache HttpRuntime.Cache["Payer"] = result; return result; } } } set { if (value == null) { HttpRuntime.Cache.Remove("Payer"); } } }
Эта проблема стояла передо мной с каждым свойством, в котором есть список
я не знаю, есть ли лучший способ кэшировать данные или в моем коде есть проблема
Именно так я и работал.
Есть ли лучший способ сделать это???
Kornfeld Eliyahu Peter
Вы слышали об этом - http://msdn.microsoft.com/en-us/library/ms178604.ASPX?
_ProgProg_
Нет, я этого не делал, но я использую Oracle DB.
Должен ли я искать OracleCacheDependency вместо SqlCacheDependency ?
Sampath Lokuge
Да, вы должны.
Sampath Lokuge
Проверьте это : http://docs.oracle.com/html/E10928_01/OracleCacheDependencyClass.htm
еще одна ссылка : http://bumbasblog.blogspot.com/2011/06/oracle-cache-dependency-in-aspnet.html
_ProgProg_
Я читал о зависимости кэша oracle, но думаю, что это почти то же самое, что я делаю?
Так что, может быть, я не понимаю, к чему ты клонишь.
Не могли бы вы быть более конкретными?
_ProgProg_
Есть Идеи?????????????