MemoryCache的SqlChangeMonitor不起作用是怎么回事?无法通过数据变化来更新缓存

bizshow 2017-06-23 11:33:05
初次接触MemoryCache, 使用SqlChangeMonitor来根据sql数据的更新缓存的策略
用起来限制比较多, 但是昨天好歹最后也给弄出来了, 能够触发更新
但是今天, 发现又不能触发, 不知道代码有什么问题?

↓↓传入 缓存的键名, 更新缓存的委托方法(委托方法会return要缓存的数据, out 缓存更新策略)


public static T GetCache<T>(string key, CacheReadFunc<T> cacheReadFunc) where T : class
{
var cacheData = MemoryCache.Default[key] as T;
if (cacheData == null)
{
if (cacheReadFunc != null)
{
cacheData = cacheReadFunc(out var policy);
MemoryCache.Default.Set(key, cacheData, policy);
}
}
return cacheData;
}


↓↓根据sql语句, return 缓存刷新策略


public static CacheItemPolicy SqlChangePolicy(string sql)
{
var connStr = Maiji.Common.Data.Data.ConnectionString();
if (!_dependency)
{
// 只需要执行一次;
_dependency = true;
SqlDependency.Start(connStr);
}
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand command = new SqlCommand(sql, conn))
{
command.Notification = null;
conn.Open();

SqlDependency dependency = new SqlDependency(command);
dependency.AddCommandDependency(command);

SqlChangeMonitor monitor = new SqlChangeMonitor(dependency);

CacheItemPolicy policy = new CacheItemPolicy();
policy.ChangeMonitors.Add(monitor);

command.ExecuteScalar();
return policy;
}
}
}


↓↓ 业务中实际调用上面两个方法


var data = GetCache("User-" + userId, (out CacheItemPolicy policy) =>
{

policy = SqlChangePolicy($"select [NickName] from [dbo].[SysUser] where [Id]='{userId}'");

// 这里实现 return 新的待缓存的数据, 省略

});
...全文
223 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
缓存不就是为了减少对数据库的请求吗? 楼主这样监控sql数据是否更新,感觉没有减少对数据库的请求啊 好像没有使用缓存的必要?
exception92 2017-06-23
  • 打赏
  • 举报
回复
用sql缓存有什么好处呢?
bizshow 2017-06-23
  • 打赏
  • 举报
回复
最终找到原因了, 今早还原了一次数据库, 数据库的dbowner变了, 原来连接数据库的用户与数据库的所有者必须一致, 才能触发更新提醒.... 汗

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧