【问题标题】:ASP.NET Cache always returns nullASP.NET 缓存始终返回 null
【发布时间】:2013-08-31 12:03:50
【问题描述】:

我在我的ASP.NET 应用程序中使用SQLCacheDependencyQuery Notifications。 我按照this article 成功设置了我的数据库。但是,每当我尝试将数据存储在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

谁能帮我指出可能缺少什么?

【问题讨论】:

  • 您能否提供有关您的问题跟踪的更多信息?执行插入时 dtResult 是否为空?在没有查询通知的情况下尝试时它会改变什么吗?具有原子类型值?
  • @jbl dtResult 从缓存中检索时始终为空。我认为缓存永远不会保存dtResult

标签: asp.net sqlcachedependency


【解决方案1】:

您可以做很多事情来调试代码并得出结论。您的缓存项目似乎被频繁删除。

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.) 此链接有 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);

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2015-08-15
    • 2012-03-18
    • 2016-11-04
    • 2016-07-28
    • 2010-11-08
    相关资源
    最近更新 更多