如何使用的SqlCacheDependency?(How to use SqlCacheDepend

2019-09-02 00:41发布

我需要实现的SqlCacheDependency为这将取决于此查询的表: SELECT Nickname FROM dbo.[User]

我已经创造了这个目的的方法:

private IEnumerable<string> GetNicknamesFromCache()
    {
        const String cacheValueName = "Nicknames";

        var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>;
        if (result == null)
        {
            result = _repository.GetAllNicknames();

            var connectionString = ConfigurationManager.ConnectionStrings["RepositoryContext"].ConnectionString;
            var sqlConnection = new SqlConnection(connectionString);
            var sqlCommand = new SqlCommand("SELECT Nickname FROM dbo.[User]", sqlConnection);
            var sqlDependency = new SqlCacheDependency(sqlCommand);

            HttpRuntime.Cache.Insert(cacheValueName, result, sqlDependency);
        }

        return result;
    }

但是,当我运行我的应用程序这是行不通的。 我检查用户(名单sys.dm_qn_subscriptions表),也没有记录。

我调查了很多时间,并且已经尝试了各种解决方案,但他们不为我工作:

  • 使用受信任的连接,并为公共角色权限的一些:

    GRANT CREATE PROCEDURE TO public
    GRANT CREATE QUEUE TO public
    GRANT CREATE SERVICE TO public
    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO public
    GRANT SELECT ON OBJECT::dbo.[User] TO public
    GRANT RECEIVE ON QueryNotificationErrorsQueue TO public

  • 使用“山”登录连接

  • 使用aspnet_regsql.exe的( aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User
  • 添加配置system.webServer在web.config中:

    <caching>
    <sqlCacheDependency enabled="true">
    <databases>
    <add name="Tmpl" pollTime="5000" connectionStringName="RepositoryContext"/>
    </databases>
    </sqlCacheDependency>
    </caching>

  • 把SqlDependency.Start()到在Global.asax Application_Start事件

  • 在SQL服务器(SQL Server 2008 Express的,SQL Server 2008中)的不同实例运行

但它并没有帮助。 它仍然无法正常工作。

我如何工作的呢?

Answer 1:

我已经找到了解决方案。

首先检查一下Service Broker的是否为您的表启用,并在需要启用它:

SELECT name, is_broker_enabled FROM sys.databases WHERE name = '<databaseName>'

ALTER DATABASE <databaseName> SET enable_broker WITH ROLLBACK IMMEDIATE

接下来在SQL Server中的新角色创建sql_dependency_role ,授予权限,并授予角色的用户:

EXEC sp_addrole 'sql_dependency_role'

GRANT CREATE PROCEDURE to sql_dependency_role
GRANT CREATE QUEUE to sql_dependency_role
GRANT CREATE SERVICE to sql_dependency_role
GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_role
GRANT VIEW DEFINITION TO sql_dependency_role
GRANT SELECT to sql_dependency_role
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sql_dependency_role
GRANT RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_role

EXEC sp_addrolemember 'sql_dependency_role', '<userName>'

在此之后添加C#代码与工作SqlCacheDependencySqlDependency (大多以同样的方式)。

我已经改变了我的方法,现在它看起来像这样:

private IEnumerable<string> GetNicknamesFromCache()
    {
        const String cacheValueName = "Nicknames";

        var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>;
        if (result == null)
        {
            result = _repository.GetAllNicknames();

            using (var connection = new SqlConnection(_config.ConnectionString))
            {
                connection.Open();

                SqlDependency.Start(_config.ConnectionString);
                var command = new SqlCommand("SELECT Nickname FROM dbo.[User]", connection);
                var dependency = new SqlCacheDependency(command);
                HttpRuntime.Cache.Insert(cacheValueName, result, dependency);

                command.ExecuteNonQuery();
            }
        }

        return result;
    }

现在,它工作正常。

不要忘记调用SqlDependency.Start创建方法之前SqlCacheDependencySqlDependency ,并在年底执行你的命令。



文章来源: How to use SqlCacheDependency?