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 для примера и основного проекта)