ASP.net Кэширование - PullRequest
       7

ASP.net Кэширование

0 голосов
/ 14 марта 2011

Я реализовал кэширование asp.net.Но я получаю странные результаты

В отличие от большинства видов кэширования, когда вы пытаетесь избежать количества обращений к БД.Я пытаюсь избежать любых попаданий в БД со стороны пользователя.Это b / c количество времени, которое занимает загрузка первой страницы.В основном это инструментальная панель с множеством графиков и длительными запросами

Я испробовал несколько приемов 1) У меня очень длительное время кеширования, истекает процесс планирования и получается новый кеш.2) и на RemoveCallback

Во втором варианте у меня весь кеш проходит через созданный мной статический класс.Цель состоит в том, чтобы истечь, чтобы обновить данные.Вот что я звоню.

Cache.Insert(dbCacheString, dtNetwork, null, DateTime.Now.AddHours(2),
    System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, 
    new CacheItemRemovedCallback(CacheManager.CacheRemovedCallback));

    public static class CacheManager
    {
        private static Hashtable times = new Hashtable();
        private static bool isRefreshingCache = false;

        public static void CacheRemovedCallback(String key, object value,
            CacheItemRemovedReason removedReason)
        {
            RefreshCache(key);
        }

        public static void StartCache()
        {
            string lcUrl = "http://localhost/ratingspage/";
            // *** Establish the request 

            try
            {

                WebClient client = new WebClient();
                client.Credentials = new NetworkCredential("xxx", "xxx", 
                    "xxx");
                byte[] myDataBuffer = client.DownloadData(lcUrl);


            }
            catch (Exception ex)
            {
                ErrHandler.WriteError(ex.Message + "\n" + 
                    ex.StackTrace.ToString());
                LogUtil.LogDebugMessages(ex.Message + ":" + 
                    ex.StackTrace.ToString());
            }

        }

        public static void RefreshCache(string key)
        {
            string controlname = "";
            if ( key.ToLower().StartsWith("control:") )
            {
                string[] tmp = key.Split(':');
                if (tmp.Length > 1)
                    controlname = tmp[1];
                else
                    return;
            }
            else
                return;

            string lcUrl = "http://localhost/ratingspage/Admin/" + "
                "LoadControl.aspx?CachingSpider=true&Control=" + controlname;
            string lcHtml = isRefreshingCache.ToString();
            // *** Establish the request 

            if (!isRefreshingCache)
            {

                isRefreshingCache = true;
                lcHtml = isRefreshingCache.ToString();
                try
                {

                    WebClient client = new WebClient();
                    client.Credentials = new NetworkCredential("xxx", 
                        "xxx", "xxx");
                    byte[] myDataBuffer = client.DownloadData(lcUrl);
                    lcHtml = Encoding.ASCII.GetString(myDataBuffer);

                }
                catch (Exception ex)
                {
                    lcHtml = ex.Message;
                    isRefreshingCache = false;
                    ErrHandler.WriteError(ex.Message + "\n" + 
                        ex.StackTrace.ToString());
                    LogUtil.LogDebugMessages(ex.Message + ":" + 
                        ex.StackTrace.ToString());
                }
                isRefreshingCache = false;
            }



            MailMessage mail = new MailMessage(
                new MailAddress("jgiblin@univision.net"), 
                new MailAddress("jgiblin@univision.net"));
            mail.Subject = "Cache Expire: " + key;
            mail.Body = string.Format("The Key {0} has expired at {1}", 
                key, DateTime.Now.ToShortDateString() + " " +
                DateTime.Now.ToShortTimeString()) + "\nRefreshing Cache: " + 
                lcHtml;
            SmtpClient smtp = new SmtpClient("mercury.utg.uvn.net");
            mail.IsBodyHtml = false;
            try
            {

                smtp.Send(mail);

            }
            catch (Exception ex)
            {
                ErrHandler.WriteError(ex.Message + "\n" + 
                    ex.StackTrace.ToString());
                LogUtil.LogDebugMessages(ex.Message + ":" + 
                    ex.StackTrace.ToString());
            }

        }
    }

по какой-то причине, когда я перехожу на страницу.Иногда данные кэшируются, а иногда нет.Здесь что-то не так

Я пытался использовать фабрику приложений, но так как на сервере нет iis 7, я не могу использовать это

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

Похоже, у вас может быть состояние гонки в вашем вызове RefreshCache. Посмотрите этот замечательный ответ, чтобы узнать, как обрабатывать синхронизацию:

C # версия синхронизированного ключевого слова Java?

На вашем месте я бы упростил свой код. Вам действительно нужно:

  1. при запуске приложения загрузить кеш
  2. когда срок действия кэша истечет, перезагрузите его
  3. если пользователь пытается получить доступ к кешированному объекту и пропускает его, спите в своем потоке на секунду и проверьте снова
0 голосов
/ 14 марта 2011

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

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

Вы можете проверить выделение памяти с помощью монитора процессов , загляните в «Cache Total Entries».

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