为什么在使用SqlCacheDependency进行表更新之后,Cache无效?
问题描述:
我一直在试图让SqlCacheDependency工作。我想我已经正确设置了一切,但是当我更新表格时,缓存中的项目不会失效。为什么在使用SqlCacheDependency进行表更新之后,Cache无效?
你能看看我的代码,看看我是否失去了什么?
我启用了Sandbox数据库的Service Broker。 我在Global.asax文件中放置了下面的代码。我也重新启动IIS以确保它被调用。
void Application_Start(object sender, EventArgs e) {
SqlDependency.Start(ConfigurationManager.ConnectionStrings["SandboxConnectionString"].ConnectionString);
}
我已经把在web.config文件中此项:
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="10000">
<databases>
<add name="Sandbox" connectionStringName="SandboxConnectionString"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
我把这个代码把物品放入缓存:
protected void CacheDataSetButton_Click(object sender, EventArgs e) {
using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["SandboxConnectionString"].ConnectionString)) {
using (SqlCommand sqlCommand = new SqlCommand("SELECT PetID, Name, Breed, Age, Sex, Fixed, Microchipped FROM dbo.Pets", sqlConnection)) {
using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand)) {
DataSet petsDataSet = new DataSet();
sqlDataAdapter.Fill(petsDataSet, "Pets");
SqlCacheDependency petsSqlCacheDependency = new SqlCacheDependency(sqlCommand);
Cache.Insert("Pets", petsDataSet, petsSqlCacheDependency, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration);
}
}
}
}
然后我绑定的GridView用此代码:
protected void BindGridViewButton_Click(object sender, EventArgs e) {
if (Cache["Pets"] != null) {
GridView1.DataSource = Cache["Pets"] as DataSet;
GridView1.DataBind();
}
}
尝试DataBind GridView时,我更改表的值,期望它使Cache [“Pets”]项无效,但似乎无限期地保留在Cache中。
答
您必须重视的SqlCacheDependency给SqlCommand 之前执行以下命令:
using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand)) {
DataSet petsDataSet = new DataSet();
SqlCacheDependency petsSqlCacheDependency =
new SqlCacheDependency(sqlCommand);
sqlDataAdapter.Fill(petsDataSet, "Pets");
Cache.Insert("Pets", petsDataSet, petsSqlCacheDependency,
DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration);
}
我改变了我的代码上面,但它仍然保留在缓存中。我也很感兴趣,它在10秒后不会从缓存中移除,这是我所期望的。 – Jason 2010-04-28 20:48:04
检查订阅是否已创建('select * from sys.dm_qn_subscriptions')并检查通知是否被阻止('select * from .sys.transmission_queue') –
2010-04-28 20:56:21
感谢您的帮助Remus。当我第一次查询这些表时,我在sys.transmission_queue中看到了三个错误“将队列中的消息排入目标队列时发生异常错误:15517,状态:1.由于主体”dbo“不能作为数据库主体执行存在,这种类型的委托人不能被冒充,或者你没有权限。“我跟随了一些帖子,通过将所有权分配给SA来解决这个问题。查看下一条评论... – Jason 2010-04-28 21:11:51