几乎我读过的每一个教程似乎都错误地设置了sqlcachedependency。我相信他们通常会把过时的轮询方法和查询通知方法混淆起来。
以下是许多示例中的两个:
Web Caching with SqlCacheDependency Simplified(非微软)
SqlCacheDependency Class(微软)
根据我的测试,如果您使用的是代理(MSSQL 2015+),则不需要进行任何.config更改,也不需要进行任何SqlCacheDependencyAdmin调用(不需要定义表等)。
我简化了就这么做…

SqlDependency.Start(connString)
...
queryString = "SELECT ...";
cacheName = "SqlCache" + queryString.GetHashCode();
...
using (var connection = new SqlConnection(connString))
{
    connection.Open();
    var cmd = new SqlCommand(queryString, connection)
    {
        Notification = null,
        NotificationAutoEnlist = true
    };

    var dependency = new SqlCacheDependency(cmd);

    SqlDataReader reader = cmd.ExecuteReader();
    try
    {
        while (reader.Read())
        {
            // Set the result you want to cache
            data = ...
        }
    }
    finally
    {
        reader.Close();
    }

    HostingEnvironment.Cache.Insert(cacheName, data, dependency);
}

(检查缓存是否为空的代码不包括在内,因为这只是设置。我只想显示缓存的设置)
这似乎可以在不需要定义查询中涉及哪些表以及对每个表生成复杂触发器的情况下工作。它只是起作用。
更让我惊讶的是,查询规则有通知:
Creating a Query for Notification(找不到比2008年更新的文档)似乎不适用。我想在我的sql中做一个top,但它仍然有效。
对于一个测试,我让它运行1000次查询,涉及一个名为“settings”的表。然后更新表中的值并重复查询。
我观察profiler是否有任何涉及“settings”一词的查询,我发现该查询只执行了1次(设置缓存),然后出现update语句,然后再次执行该查询(缓存已失效,查询再次运行)
我担心在我2-3个小时的努力中,我错过了一些东西,这真的很简单吗?
我真的可以提出任何我想要的问题,它将只是工作?我在寻找任何我正在做危险/非标准的事情的指针,或者任何我丢失的小字体

最佳答案

var dependency=新的sqlcachedependency(cmd);
当您编写这样的查询时,您可以在其中自动定义表名。您的连接已经有了数据库名。
这是一种不明确的方式。
捕捉异常并知道哪里出错的显式方法是这样的。

// Declare the SqlCacheDependency instance, SqlDep.
        SqlCacheDependency SqlDep = null;

        // Check the Cache for the SqlSource key.
        // If it isn't there, create it with a dependency
        // on a SQL Server table using the SqlCacheDependency class.
        if (Cache["SqlSource"] == null) {

            // Because of possible exceptions thrown when this
            // code runs, use Try...Catch...Finally syntax.
            try {
                // Instantiate SqlDep using the SqlCacheDependency constructor.
                SqlDep = new SqlCacheDependency("Northwind", "Categories");
            }

            // Handle the DatabaseNotEnabledForNotificationException with
            // a call to the SqlCacheDependencyAdmin.EnableNotifications method.
            catch (DatabaseNotEnabledForNotificationException exDBDis) {
                try {
                    SqlCacheDependencyAdmin.EnableNotifications("Northwind");
                }

                // If the database does not have permissions set for creating tables,
                // the UnauthorizedAccessException is thrown. Handle it by redirecting
                // to an error page.
                catch (UnauthorizedAccessException exPerm) {
                    Response.Redirect(".\\ErrorPage.htm");
                }
            }

            // Handle the TableNotEnabledForNotificationException with
            // a call to the SqlCacheDependencyAdmin.EnableTableForNotifications method.
            catch (TableNotEnabledForNotificationException exTabDis) {
                try {
                    SqlCacheDependencyAdmin.EnableTableForNotifications("Northwind", "Categories");
                }

                // If a SqlException is thrown, redirect to an error page.
                catch (SqlException exc) {
                    Response.Redirect(".\\ErrorPage.htm");
                }
            }

            // If all the other code is successful, add MySource to the Cache
            // with a dependency on SqlDep. If the Categories table changes,
            // MySource will be removed from the Cache. Then generate a message
            // that the data is newly created and added to the cache.
            finally {
                Cache.Insert("SqlSource", Source1, SqlDep);
                CacheMsg.Text = "The data object was created explicitly.";

            }
        }

        else {
            CacheMsg.Text = "The data was retrieved from the Cache.";
        }

07-26 06:28