2013-08-30 1 views
3

Я использую SQLCacheDependency в моем приложении ASP.NET с Query Notifications. Я следил за this article, чтобы настроить мою базу данных с успехом. Каждый раз, когда я пытаюсь хранить данные в объекте cache.Он просто не имеет значения. Он всегда null. У меня нет ошибок и исключений. Вот мой кодASP.NET Cache всегда возвращает null

Global.asax

void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     System.Data.SqlClient.SqlDependency. 
     Start(ConfigurationManager.ConnectionStrings["McdConn"].ToString()); 

    } 

void Application_End(object sender, EventArgs e) 
    { 
     // Code that runs on application shutdown 
     System.Data.SqlClient.SqlDependency. 
     Stop(ConfigurationManager.ConnectionStrings["McdConn"].ToString()); 
    } 

public static class CacheManagement 
{ 
    public static DataTable CreateCache(string cacheName, string tableName, string query) 
    { 
     DataTable dtResult = new DataTable(); 
     try 
     { 
      string connectionString = ConfigurationManager.ConnectionStrings["McdConn"].ToString(); 
      dtResult = HttpContext.Current.Cache[cacheName] as DataTable; 

      if (dtResult == null) 
      { 
       dtResult = new DataTable(); 
       using (var cn = new SqlConnection(connectionString)) 
       { 
        cn.Open(); 
        var cmd = new SqlCommand(query, cn); 
        cmd.Notification = null; 
        cmd.NotificationAutoEnlist = true; 
        SqlCacheDependencyAdmin.EnableNotifications(connectionString); 
        if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionString).Contains(tableName)) 
        { 
         SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString,tableName); 
        } 

        var dependency = new SqlCacheDependency(cmd); 
        //SqlDataAdapter ad = new SqlDataAdapter(cmd); 
        //ad.Fill(dsResult); 
        SqlDataReader reader = cmd.ExecuteReader(); 
        dtResult.Load(reader); 
        HttpContext.Current.Cache.Insert(cacheName, dtResult, dependency); 

       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Exception_Log.ExceptionMethod("Web", "CacheManagement.cs", "CacheManagement", ex); 
     } 

     return dtResult = HttpContext.Current.Cache[cacheName] as DataTable; 
    } 

} 

Код За

var dtCachedCategories = HttpContext.Current.Cache["tbl_CategoryMaster_Cached"] as DataTable; 
if (dtCachedCategories == null) 
{ 
dtCachedCategories = CacheManagement.CreateCache("tbl_CategoryMaster_Cached","dbo.tbl_CategoryMaster_Languages", "Select * from dbo.tbl_CategoryMaster_Languages"); 

} 

Значение выше всегда возвращает null.

Может ли кто-нибудь помочь мне в указании того, чего не хватает?

+0

Вы могли бы предоставить более подробную информацию о своей проблеме? Является ли dtResult null при выполнении вставки? Изменяет ли что-либо при попытке без уведомления о запросах? с атомными значениями типа? – jbl

+0

@jbl 'dtResult' всегда имеет значение null при извлечении из cache.I думаю, что Cache никогда не держит' dtResult'. – freebird

ответ

3

Хорошо, что вы можете сделать, чтобы отладить ваш код и прийти к выводу. Кажется, что ваш кеш-элемент слишком часто удаляется.

1.) Используйте CacheItemPriority.NotRemovable для Cache.Insert(), чтобы убедиться, что ASP.NET не удаляет ваш товар, когда это так. используйте метод Insert(), поясненный here. Проверьте это также MSDN .

2.) Чтобы узнать причину, по которой ваш кешированный элемент удаляется, зарегистрируйте это действие удаления, используя CacheItemRemovedCallback вариант делегата вашего метода Cache.Insert(). Проверьте эту версию Insert method overload, а также это link.

3.) Убедитесь, что ваш dtresult, а также ваш reader не имеет значения. Проверьте линии:

SqlDataReader reader = cmd.ExecuteReader(); & dtResult.Load(reader);, вместе с вашими журналами.

4.) Проверяйте время использования бассейна. У этого link есть все, что связано с настройками пула приложений (IIS 7 +).

5.) Эта ссылка имеет решение для App пула IIS 6: http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon

Кроме того, попробуйте использовать HttpRuntime.Cache метод, чтобы увидеть, если он работает.

System.Web.HttpRuntime.Cache.Insert(cacheName, dtResult, dependency);