Alachisoft NCache存储过程添加SqlCacheDependency后缓存项立即移除求助
解决SqlCacheDependency添加缓存后立即移除的问题
你遇到的缓存项刚添加就被移除、CacheItemRemovedReason为4(对应DependencyChanged)的问题,大概率是依赖关联逻辑或数据库配置出了问题。结合你的代码和环境,我整理了几个关键排查点和解决方案:
1. 修正缓存项依赖的设置顺序
你的代码里存在一个致命逻辑错误:先把缓存项添加到缓存,再设置它的Dependency。这会导致依赖关系根本没被正确关联到缓存项上,NCache无法识别这个依赖规则,直接触发了移除操作。
修正后的代码必须先初始化依赖,再将项添加到缓存:
string storedProcName = "dbo.TestStoredProc1"; SqlCmdParams sqlParams = new SqlCmdParams(); sqlParams.Value = prod.ProductID; Dictionary<string, SqlCmdParams> prms = new Dictionary<string, SqlCmdParams>(); prms.Add("ID", sqlParams); // 先设置依赖,再执行缓存添加操作 item.Dependency = new SqlCacheDependency(connString, $"select * from dbo.state_lookup where state_id = {prod.ProductID.ToString()}"); _cache.Add(prod.ProductID.ToString(), item, DSWriteOption.None, null);
2. 确认SQL Server Service Broker已启用
SqlCacheDependency依赖SQL Server的Service Broker来推送数据变更通知,必须确保你的目标数据库已开启该功能:
- 执行查询检查状态:
SELECT name, is_broker_enabled FROM sys.databases WHERE name = '你的数据库名称'; - 如果
is_broker_enabled返回0,执行开启命令:ALTER DATABASE 你的数据库名称 SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
3. 验证表的查询通知配置
确保state_lookup表已启用查询通知支持:
- 检查表状态:
SELECT name, is_query_notification_on FROM sys.tables WHERE name = 'state_lookup'; - 如果未启用,执行开启命令:
ALTER TABLE dbo.state_lookup ENABLE QUERY NOTIFICATION;
4. 检查NCache的权限与配置
- 确认运行NCache服务的账户拥有足够的数据库权限:需要能访问Service Broker相关系统对象、创建队列和服务(NCache自动配置依赖时需要)。
- 检查NCache配置文件(如
config.ncconf)中是否正确配置了SQL Dependency的连接字符串,且相关功能处于启用状态。
额外优化建议
你的依赖查询select * from dbo.state_lookup where state_id = {prod.ProductID}是合规的,但建议明确指定列名而非使用*,避免因表结构变更导致的意外依赖失效。
内容的提问来源于stack exchange,提问作者monofal
相关产品推荐
相关产品推荐

