SqlCacheDepency .. QueryNotification подписка не работает - PullRequest
0 голосов
/ 17 января 2019
 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;
        }
    }
}

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...