添加数据库条目时是否会更新缓存内容?

时间:2015-11-03 21:45:34

标签: c# mysql sql asp.net

好的!到目前为止,我还在尝试使用缓存及其功能!关于数据库更新的快速问题

TLDR:数据库更新何时提升到缓存?如果未设置缓存过期时间,用户退出并重新进入应用程序时是否清除?或者HTTPContext.Current.Cache是​​一个全局缓存(即,只有当所有用户退出应用程序时才会清除[如果发生])?

说我有一张桌子:

CREATE TABLE #DaysOfTheWeek(
     DayKey INT
    ,DayDescription VARCHAR(20)
);

INSERT INTO #DaysOfTheWeek VALUES(1, 'Monday');
INSERT INTO #DaysOfTheWeek VALUES(2, 'Tuesday');
INSERT INTO #DaysOfTheWeek VALUES(3, 'Wednesday');
INSERT INTO #DaysOfTheWeek VALUES(4, 'Thursday');
INSERT INTO #DaysOfTheWeek VALUES(5, 'Friday');

我将这些添加到ASP.NET Web应用程序(.NET 4.5)的下拉列表中。

我知道这是非常糟糕的代码。不要复制和粘贴。 SQL注入是正确的。这应该是一个存储过程。我是个坏人。

//On page load.

private void PopulateDaysOfWeekDropDownList()
{
    var days = new List<ListItem>();

    if (HttpContext.Current.Cache["DaysOfTheWeek"] == null)
    {
        //Go to the database and get all days.
        var dt = GetDaysOfTheWeek();
        foreach(DataRow row in dt.Rows)
        {
            var day = new ListItem();
            day.Key = row["DayKey"].ToString(); //Key may not be correct, I'm not using a compiler here.
            day.Description = row["DayDescription"].ToString();
            days.add(day);
        }
        HttpContext.Current.Cache["DaysOfTheWeek"] = days;
    }
    else
    {
        //Retrieve the value from the web cache.
        days = (List<ListItem>)HttpContext.Current.Cache["DaysOfTheWeek"];
    }

    //Bind the results to the web source.
    ddlDaysOfWeek.DataSource = days;
    ddlDaysOfWeek.DataBind();
}


public DataTable GetDaysOfTheWeek()
{   
    using (var cnn = new SqlConnection("myConnectionString"))
    {
        using (var dt = new DataTable())
        {
            var command = "SELECT DayKey, DayDescription FROM #DaysOfTheWeek WITH(NOLOCK)"
            using (var cmd = new SqlCommand(command, cnn) { CommandType = CommandType.Text})
            {
                using (var adapter = new SqlDataAdapter(cmd))
                {
                    adapter.Fill(dt);
                }               

                return dt;
            }
        }
    }
}

一切都很好。这在我的系统上运行了几天,网络缓存有五天。

让我们稍后再说周末:

INSERT INTO #DaysOfTheWeek VALUES(0, 'Sunday');
INSERT INTO #DaysOfTheWeek VALUES(6, 'Saturday');

现在数据库将包含一周中的所有七天。下一页加载事件会接收新的一天吗?或者它是否需要缓存副本并仍然只显示原来的五个?

缓存副本何时(如果有的话)到期并重新获取所有七天?

从系统管理员的角度来看,我们可以做些什么来手动重新刷新服务器缓存?

1 个答案:

答案 0 :(得分:1)

您可以使用SqlCacheDependency。而不是直接将项目分配给缓存,就像您在以下代码中一样:

HttpContext.Current.Cache["DaysOfTheWeek"] = days;

您可能希望使用具有添加的依赖项的Cache.Insert。如果缓存依赖于多个表,您还可以聚合依赖关系。

var cacheItem = days;
var tableName = "someTable";
var databaseName = "someDb";
var cacheKey = "someCacheKey";
var aggDependency = new System.Web.Caching.AggregateCacheDependency();
aggDependency.Add(new System.Web.Caching.SqlCacheDependency(databaseName, tableName));
HttpContext.Current.Cache.Insert(cacheKey, cacheItem, aggDependency);

当缓存依赖关系中的表更改时,缓存将被无效并被删除。

相关问题