public void Invalidate(string className, object primaryKeyValue, SoodaCacheInvalidateReason reason)
        {
            if (logger.IsTraceEnabled)
            {
                logger.Trace("Invalidating object {0}({1}). Reason: {2}", className, primaryKeyValue, reason);
            }

            _rwlock.AcquireWriterLock(-1);
            try
            {
                SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
                _objectCache.Remove(cacheKey);

                LruCache cachedCollectionsDependentOnClass = (LruCache)_collectionsDependentOnClass[className];
                if (cachedCollectionsDependentOnClass != null)
                {
                    foreach (string key in cachedCollectionsDependentOnClass.Keys)
                    {
                        _collectionCache.Remove(key);
                    }
                    cachedCollectionsDependentOnClass.Clear();
                }
            }
            finally
            {
                _rwlock.ReleaseWriterLock();
            }
        }
Exemplo n.º 2
0
        public void FillSnapshotTable(DataSet dataSet, string tableName)
        {
            lock (this)
            {
                DataTable dt = dataSet.Tables.Add(tableName);
                dt.Columns.Add("LruPosition", typeof(int));
                dt.Columns.Add("Class", typeof(string));
                dt.Columns.Add("Key", typeof(string));
                dt.Columns.Add("Value", typeof(string));
                dt.Columns.Add("AddedTime", typeof(DateTime));
                dt.Columns.Add("LastAccessTime", typeof(DateTime));
                dt.Columns.Add("ExpirationTime", typeof(DateTime));
                dt.Columns.Add("UsedCount", typeof(int));

                int pos = 0;

                for (LruCacheNode node = _lruHead; node != null; node = node.Next)
                {
                    DataRow row = dt.NewRow();

                    string className;
                    string keyValue;

                    SoodaCacheKey         ck1 = node.Key as SoodaCacheKey;
                    SoodaCachedCollection scc = node.Value as SoodaCachedCollection;

                    if (ck1 != null)
                    {
                        className = ck1.ClassName;
                        keyValue  = Convert.ToString(ck1.KeyValue);
                    }
                    else if (scc != null)
                    {
                        className = scc.RootClassName;
                        keyValue  = scc.CollectionKey;
                    }
                    else
                    {
                        className = Convert.ToString(node.Key);
                        keyValue  = null;
                    }

                    row.ItemArray = new object[]
                    {
                        pos++,
                        className,
                        keyValue,
                        Convert.ToString(node.Value),
                        node.AddedTime,
                        node.LastAccessTime,
                        node.ExpirationTime,
                        node.UsedCount
                    };
                    dt.Rows.Add(row);
                }
            }
        }
 public SoodaCacheEntry Find(string className, object primaryKeyValue)
 {
     _rwlock.AcquireReaderLock(-1);
     try
     {
         SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
         return (SoodaCacheEntry)_objectCache.Get(cacheKey);
     }
     finally
     {
         _rwlock.ReleaseReaderLock();
     }
 }
 public SoodaCacheEntry Find(string className, object primaryKeyValue)
 {
     _rwlock.AcquireReaderLock(-1);
     try
     {
         SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
         return((SoodaCacheEntry)_objectCache.Get(cacheKey));
     }
     finally
     {
         _rwlock.ReleaseReaderLock();
     }
 }
 public void Add(string className, object primaryKeyValue, SoodaCacheEntry entry, TimeSpan expirationTimeout, bool slidingExpiration)
 {
     _rwlock.AcquireWriterLock(-1);
     try
     {
         SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
         _objectCache.Set(cacheKey, entry, expirationTimeout, slidingExpiration);
         if (logger.IsTraceEnabled)
         {
             logger.Trace("Adding {0} to cache.", cacheKey);
         }
     }
     finally
     {
         _rwlock.ReleaseWriterLock();
     }
 }
        public void StoreCollection(string cacheKey, string rootClassName, IList primaryKeys, string[] dependentClassNames, bool evictWhenItemRemoved, TimeSpan expirationTimeout, bool slidingExpiration)
        {
            if (cacheKey != null)
            {
                _rwlock.AcquireWriterLock(-1);
                try
                {
                    if (logger.IsTraceEnabled)
                    {
                        logger.Trace("Storing collection: {0} {1} items. Dependent on: [ {2} ]", cacheKey, primaryKeys.Count, String.Join(",", dependentClassNames));
                    }

                    SoodaCachedCollection cc = new SoodaCachedCollection(cacheKey, rootClassName, primaryKeys);

                    if (evictWhenItemRemoved)
                    {
                        foreach (object o in primaryKeys)
                        {
                            SoodaCacheKey   k = new SoodaCacheKey(rootClassName, o);
                            SoodaCacheEntry e = (SoodaCacheEntry)_objectCache[k];
                            if (e != null)
                            {
                                //logger.Trace("Registering {0} as dependent of {1}", cacheKey, e);
                                e.RegisterDependentCollection(cc);
                            }
                            ;
                        }
                    }
                    _collectionCache.Set(cacheKey, cc, expirationTimeout, slidingExpiration);

                    RegisterDependentCollectionClass(cacheKey, rootClassName, expirationTimeout, slidingExpiration);
                    if (dependentClassNames != null)
                    {
                        for (int i = 0; i < dependentClassNames.Length; ++i)
                        {
                            RegisterDependentCollectionClass(cacheKey, dependentClassNames[i], expirationTimeout, slidingExpiration);
                        }
                    }
                }
                finally
                {
                    _rwlock.ReleaseWriterLock();
                }
            }
        }
 public void Add(string className, object primaryKeyValue, SoodaCacheEntry entry, TimeSpan expirationTimeout, bool slidingExpiration)
 {
     _rwlock.AcquireWriterLock(-1);
     try
     {
         SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
         _objectCache.Set(cacheKey, entry, expirationTimeout, slidingExpiration);
         if (logger.IsTraceEnabled)
         {
             logger.Trace("Adding {0} to cache.", cacheKey);
         }
     }
     finally
     {
         _rwlock.ReleaseWriterLock();
     }
 }
        public void StoreCollection(string cacheKey, string rootClassName, IList primaryKeys, string[] dependentClassNames, bool evictWhenItemRemoved, TimeSpan expirationTimeout, bool slidingExpiration)
        {
            if (cacheKey != null)
            {
                _rwlock.AcquireWriterLock(-1);
                try
                {
                    if (logger.IsTraceEnabled)
                    {
                        logger.Trace("Storing collection: {0} {1} items. Dependent on: [ {2} ]", cacheKey, primaryKeys.Count, String.Join(",",dependentClassNames));
                    }

                    SoodaCachedCollection cc = new SoodaCachedCollection(cacheKey, rootClassName, primaryKeys);

                    if (evictWhenItemRemoved)
                    {
                        foreach (object o in primaryKeys)
                        {
                            SoodaCacheKey k = new SoodaCacheKey(rootClassName, o);
                            SoodaCacheEntry e = (SoodaCacheEntry)_objectCache[k];
                            if (e != null)
                            {
                                //logger.Trace("Registering {0} as dependent of {1}", cacheKey, e);
                                e.RegisterDependentCollection(cc);
                            };
                        }
                    }
                    _collectionCache.Set(cacheKey, cc, expirationTimeout, slidingExpiration);

                    RegisterDependentCollectionClass(cacheKey, rootClassName, expirationTimeout, slidingExpiration);
                    if (dependentClassNames != null)
                    {
                        for (int i = 0; i < dependentClassNames.Length; ++i)
                        {
                            RegisterDependentCollectionClass(cacheKey, dependentClassNames[i], expirationTimeout, slidingExpiration);
                        }
                    }
                }
                finally
                {
                    _rwlock.ReleaseWriterLock();
                }
            }
        }
        public void Invalidate(string className, object primaryKeyValue, SoodaCacheInvalidateReason reason)
        {
            if (logger.IsTraceEnabled)
            {
                logger.Trace("Invalidating object {0}({1}). Reason: {2}", className, primaryKeyValue, reason);
            }

            _rwlock.AcquireWriterLock(-1);
            try
            {
                SoodaCacheKey cacheKey = new SoodaCacheKey(className, primaryKeyValue);
                _objectCache.Remove(cacheKey);

                LruCache cachedCollectionsDependentOnClass = (LruCache)_collectionsDependentOnClass[className];
                if (cachedCollectionsDependentOnClass != null)
                {
                    foreach (string key in cachedCollectionsDependentOnClass.Keys)
                    {
                        _collectionCache.Remove(key);
                    }
                    cachedCollectionsDependentOnClass.Clear();
                }
            }
            finally
            {
                _rwlock.ReleaseWriterLock();
            }
        }