Vol*_*ula 14 .net c# sql-server caching service-broker
我需要为一个表实现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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序时,它不起作用.我检查了订户列表(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
使用'sa'登录进行连接
aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User
)将配置添加到web.config中的system.webServer:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="Tmpl" pollTime="5000" connectionStringName="RepositoryContext"/>
</databases>
</sqlCacheDependency>
</caching>
将SqlDependency.Start()放入Global.asax Application_Start事件中
在sql server的不同实例上运行(SQL Server 2008 Express,SQL Server 2008)
但它没有帮助.它仍然无法正常工作.
我如何使其工作?
Vol*_*ula 19
我已经找到了解决方案.
首先检查是否为您的表启用了Service Broker,并在需要时启用它:
SELECT name, is_broker_enabled FROM sys.databases WHERE name = '<databaseName>'
ALTER DATABASE <databaseName> SET enable_broker WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
接下来在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>'
Run Code Online (Sandbox Code Playgroud)
之后添加C#代码以便使用SqlCacheDependency
或SqlDependency
(大多以相同的方式).
我已经改变了我的方法,现在它看起来像这样:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在它工作正常.
不要忘记调用SqlDependency.Start
创建方法之前SqlCacheDependency
或SqlDependency
并在年底执行你的命令.
归档时间: |
|
查看次数: |
16600 次 |
最近记录: |