为什么在使用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); 
} 
+0

我改变了我的代码上面,但它仍然保留在缓存中。我也很感兴趣,它在10秒后不会从缓存中移除,这是我所期望的。 – Jason 2010-04-28 20:48:04

+1

检查订阅是否已创建('select * from sys.dm_qn_subscriptions')并检查通知是否被阻止('select * from .sys.transmission_queue') – 2010-04-28 20:56:21

+0

感谢您的帮助Remus。当我第一次查询这些表时,我在sys.transmission_queue中看到了三个错误“将队列中的消息排入目标队列时发生异常错误:15517,状态:1.由于主体”dbo“不能作为数据库主体执行存在,这种类型的委托人不能被冒充,或者你没有权限。“我跟随了一些帖子,通过将所有权分配给SA来解决这个问题。查看下一条评论... – Jason 2010-04-28 21:11:51