代码之家  ›  专栏  ›  技术社区  ›  Jason

为什么在使用sqlcacheDependency更新表后缓存不失效?

  •  1
  • Jason  · 技术社区  · 15 年前

    我一直在尝试让sqlcacheDependency工作。我认为所有的设置都是正确的,但是当我更新表时,缓存中的项不会失效。

    你能看看我的代码,看看我是否遗漏了什么吗?

    我为沙盒数据库启用了ServiceBroker。 我在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();
        }
    }
    

    在尝试对GridView进行数据绑定期间,我更改了表的值,希望它使缓存[“pets”]项无效,但它似乎无限期地留在缓存中。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Remus Rusanu    15 年前

    必须将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);
    }