SqlCacheDepency.. Подписка QueryNotification не работает

 public class MemoryCacheHelper
{
    private static string _conn = ConfigurationManager.ConnectionStrings["EFMultiPoolDbContext"] != null ?
       ConfigurationManager.ConnectionStrings["EFMultiPoolDbContext"].ConnectionString :
       ConfigurationManager.ConnectionStrings["EFDbContext"].ConnectionString;

    private static Logger _logger = LogManager.GetCurrentClassLogger();
    private static int _hourOfExpiry = 8; // ConfigurationHelper.GetValue<int>("Cache:HourExpiry", 8);

    //private static SqlDependency dependency;
    private static ObjectCache _cache = MemoryCache.Default;
    private static WebCaching.Cache _webcache = new WebCaching.Cache();

    private ReaderWriterLockSlim _cachelock = null;

    public MemoryCacheHelper()
    {
        _cachelock = new ReaderWriterLockSlim();
        EnoughPermission();
    }

    public void Add(string key, object val)
    {
        Add(key, val, new CacheItemPolicy()
        {
            SlidingExpiration = new TimeSpan(_hourOfExpiry, 0, 0)
        });
    }

    public void Add(string key, object val, int seconds)
    {
        Add(key, val, new CacheItemPolicy()
        {
            //SlidingExpiration = new TimeSpan(0,0,seconds)
            AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddSeconds(seconds))
        });
    }


    public void Add(string key, object val, int mins, WebCaching.CacheDependency dependency)
    {
        if (val == null)
            return;

        //_cachelock.EnterReadLock();

        try
        {
            //if (_cache1.Get(key) != null)
            {
                _logger.Debug(string.Format("Cache Key: {0} set at {1}", key, DateTime.Now));
                _webcache.Insert(key, val, dependency, WebCaching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(mins),
                    WebCaching.CacheItemPriority.Default, CacheItemRemovedCallback);
                //if (key == "productTypes")
                // _logger.Debug(string.Format("Cache Key: {0} set at {1}", key, DateTime.Now));
            }

        }
        finally
        {
            // _cachelock.ExitReadLock();
        }
    }



    public static T CheckOrRequeryWebCache<T>(string key, int mins, string commandText)
    {
        var cache = new MemoryCacheHelper();
        object res = cache.GetWebCacheItem(key);

        if (res == null)
        {
            SqlDependency.Stop(_conn);
            SqlDependency.Start(_conn);

            using (var con = new SqlConnection(_conn))
            {
                using (var cmd = new SqlCommand())
                {

                    con.Open();
                    cmd.Connection = con;
                    cmd.Notification = null;
                    SqlDataAdapter da = new SqlDataAdapter(cmd);

                    cmd.CommandText=@"SET ANSI_NULLS ON;SET ANSI_PADDING ON;SET ANSI_WARNINGS ON;SET CONCAT_NULL_YIELDS_NULL ON;SET QUOTED_IDENTIFIER ON;SET NUMERIC_ROUNDABORT OFF;SET ARITHABORT ON;";
                    {
                        cmd.ExecuteNonQuery();
                    }

                    cmd.CommandText = commandText;

                    var ds = new DataSet();
                    da.Fill(ds);

                    if (key == "visualIdPLUs")
                        res = ds.Tables[0].AsEnumerable().Select(x => Convert.ToString(x["ParentPLU"])).ToList();
                    else
                        res = ds.Tables[0].AsEnumerable().Select(x => new BlockedGIdDateExchangePLU
                        {
                            PLU = Convert.ToString(x["ParentPLU"]),
                            CanExchangeDate = Convert.ToBoolean(x["CanExchangeDate"]),
                            CanExchangeGId = Convert.ToBoolean(x["CanExchangeGId"])
                        }).ToList();

                    var dependency = new WebCaching.SqlCacheDependency(cmd);

                    //dependency = new SqlDependency(cmd);
                    //dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                    cache.Add(key, res, mins, dependency);
                }
            }
        }
        return (T)res;

    }

    private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {

    }
    private bool EnoughPermission()
    {
        SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
        try
        {
            perm.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

трассировка профилировщика для рабочего образца   трассировка профилировщика для моего основного проектаAm работает над SqlCacheDependency. мне нужно реализовать это в моем основном проекте

чтобы сначала протестировать, я создал образец проекта MVC и реализовал его, он отлично работает, я могу видеть все события QueryNotification в профилировщике.

когда я пытаюсь запустить тот же код в моем основном проекте, он не работает ... проблема, которую я обнаружил в профилировщике sql, заключается в том, что не все события qn запускаются ... начиная с события susbscription.

может ли кто-нибудь предложить, что не так .. (примечание: я использую одну и ту же базу данных и логин sql как для примера, так и для основного проекта)

Добро пожаловать в Stack Overflow! Не могли бы вы уточнить, как ваш код «не работает»? Чего вы ожидали и что произошло на самом деле? Если вы получили исключение/ошибку, опубликуйте строку, в которой это произошло, и сведения об исключении/ошибке. Пожалуйста, отредактируйте эти данные, иначе мы не сможем помочь.

alpereira7 17.01.2019 13:21

Привет, я пытаюсь работать с SqlQueryNotifications и SqlCacheDependency, приведенный выше код успешно может создать службу sqlnotification в SqlServer.. но мое приложение по какой-то неизвестной причине не может подписаться на QueryNotification, тот же код отлично работает в образце приложения mvc.. есть прикрепленная трассировка профилировщика sql как для рабочей, так и для нерабочей версии, рабочая трассировка sql показывает кучу событий QN, эти события отсутствуют на другом изображении, поэтому уведомления не работают, а объект кеша не обновляется

Sandeep Pusthey 17.01.2019 13:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
30
0

Другие вопросы по теме