Поскольку вы используете SQL Server, я рекомендую использовать что-то вроде объекта SqlCacheDependency или объекта SqlDependency в составе служб Уведомления о запросах в SQL Server.
Я успешно использовал это в различных проектах, в результате чего бремя уведомлений было в базе данных, а не какой-то механизм опроса, который я пишу сам.Вот пример того, как я использую его для кэширования информации о ролях:
public CacheDependency GetRoleActionCacheDependency()
{
using (var connection = new SqlConnection(Database.Database.Connection.ConnectionString))
{
connection.Open();
using (SqlCommand sc = new SqlCommand("select roleid, actionid from dbo.RoleAction", connection))
{
var dependency = new SqlCacheDependency(sc);
sc.ExecuteNonQuery();
connection.Close();
return dependency;
}
}
}
Эта зависимость кеша делает кеш недействительным при изменении чего-либо в таблице ролей действий.Я могу получать уведомления на уровне строк, имея параметр в запросе.
Вот как я называю этот код.Вы могли бы сделать свой фактический зависимый объект сохраненным в кеше, но в моем конкретном случае сам экземпляр объекта живет в приложении (статический), поэтому мне не нужно было кэшировать его как таковой, мне просто нужно было сделать его недействительным.Что я делаю здесь, установив его в null (геттер управляет его повторным заполнением).
CacheDependency rolePathAccessCacheDependency = GetRoleActionRepository().GetRoleActionCacheDependency();
HttpContext.Current.Cache.Add("anything will do", new object(), rolePathAccessCacheDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal,
(key, value, reason) =>
{
_rolePathAccess = null;
});
Также, чтобы завершить пример, вам нужно это при запуске приложения global.asax:
SqlDependency.Start(ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString);
И конец приложения:
SqlDependency.Stop(ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString);
Еще одна вещь, которую я забыл, это то, что зависит от того, какие службы посредника в SQL Server включены.Вот способ включить его, но учтите, что первое утверждение волшебным образом дает вам эксклюзивный доступ к базе данных и откатывает все остальное, поэтому используйте его только в производстве, если вы знаете, что делаете.Второе утверждение - это все, что вам действительно нужно, если у вас уже есть эксклюзивный доступ.
ALTER DATABASE MYDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE MYDatabase SET ENABLE_BROKER
ALTER DATABASE MYDatabase SET MULTI_USER
GO