好的!到目前为止,我还在尝试使用缓存及其功能!关于数据库更新的快速问题
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');
现在数据库将包含一周中的所有七天。下一页加载事件会接收新的一天吗?或者它是否需要缓存副本并仍然只显示原来的五个?
缓存副本何时(如果有的话)到期并重新获取所有七天?
从系统管理员的角度来看,我们可以做些什么来手动重新刷新服务器缓存?
答案 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);
当缓存依赖关系中的表更改时,缓存将被无效并被删除。