Comment utiliser SqlCacheDependency?
J'ai besoin pour mettre en œuvre SqlCacheDependency pour une table qui dépendra de cette requête:
SELECT Nickname FROM dbo.[User]
.
J'ai créé une méthode pour cela:
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;
}
Mais quand je lance mon application ne fonctionne pas.
J'ai vérifié la liste des abonnés (sys.dm_qn_subscriptions
table) et il n'y a pas de documents.
J'ai étudié beaucoup de temps et que vous avez déjà essayé plusieurs solutions, mais ils ne fonctionne pas pour moi:
-
de confiance de connexion et définissez des autorisations pour le rôle du public:
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
-
utiliser " sa " login pour la connexion
- utilisation aspnet_regsql.exe (
aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User
) -
ajouter une configuration de système.serveur web dans le web.config:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="Tmpl" pollTime="5000" connectionStringName="RepositoryContext"/>
</databases>
</sqlCacheDependency>
</caching>
-
mettre le SqlDependency.Démarrer() dans le Global.asax événement Application_Start
-
exécuter à différentes instances de sql server (SQL Server 2008 Express, SQL Server 2008)
Mais Il n'a pas aidé. Cela ne fonctionne toujours pas.
Comment puis-je le faire fonctionner?
OriginalL'auteur Volodymyr Machula | 2013-05-05
Vous devez vous connecter pour publier un commentaire.
J'ai déjà trouvé la solution.
Au premier abord vérifier si le Service Broker est activé pour votre table et lui permettre, si nécessaire:
Prochaine créer dans SQL Server nouveau rôle
sql_dependency_role
, l'octroi des autorisations et de la subvention rôle de l'utilisateur:Après que ajouter de code C# pour travailler avec
SqlCacheDependency
ouSqlDependency
(essentiellement de la même façon).J'ai changé ma méthode et maintenant il ressemble à ceci:
Maintenant il fonctionne très bien.
N'oubliez pas invoquer
SqlDependency.Start
méthode avant de créerSqlCacheDependency
ouSqlDependency
et d'exécuter votre commande à la fin.Pour répondre à ma propre question ci - dessus, il est nécessaire de garder cette connexion ouverte de sorte que le service broker peut envoyer ces notifications. Qui le rend un peu plus difficile à concevoir si vous avez beaucoup d'entrées de cache qui ont besoin d'être rafraîchi.
OriginalL'auteur Volodymyr Machula