private void ProcessStorage()
 {
     try
     {
         obj_rwl.AcquireWriterLock(System.Threading.Timeout.Infinite);
         //在对象集合中寻找
         List <CCacheItem_WuQi <K, T> > result = new List <CCacheItem_WuQi <K, T> >();
         foreach (KeyValuePair <K, CCacheItem_WuQi <K, T> > defront in obj_containers)
         {
             CCacheItem_WuQi <K, T> item = (CCacheItem_WuQi <K, T>)defront.Value;
             if (false != item.IsExpire(intervalMinuteTime))
             {
                 result.Add(item);
             }
         }
         foreach (CCacheItem_WuQi <K, T> item in result)
         {
             obj_containers.Remove(item.key);
         }
     }
     catch (System.Exception e)
     {
         CExceptionContainer_WuQi.ProcessException(e);
         throw e;
     }
     finally
     {
         obj_rwl.ReleaseWriterLock();
     }
 }
Beispiel #2
0
 public bool Insert(K k, CCacheItem_WuQi <K, T> item, ref ICacheStorage_WuQi <K, T> container)
 {
     if (!container.Contains(k))
     {
         container.Add(k, item);
     }
     return(true);
 }
Beispiel #3
0
        /// <summary>
        /// 获取此存储器中所有项的值
        /// </summary>
        /// <returns>存储项列表(数组)</returns>
        public CCacheItem_WuQi <K, T>[] GetAllValues()
        {
            CCacheItem_WuQi <K, T>[] tmp = new CCacheItem_WuQi <K, T> [this.obj_cache.Count];

            System.Collections.Generic.Dictionary <K, CCacheItem_WuQi <K, T> > .ValueCollection vc = this.obj_cache.Values;

            vc.CopyTo(tmp, 0);
            return(tmp);
        }
Beispiel #4
0
 public T SelectSingleObject(ref ICacheStorage_WuQi <K, T> container, K k, out int getall)
 {
     if (false != container.Contains(k))
     {
         getall = 1;//该数据已经查询到了,不在需要到数据库中查询了。
         CCacheItem_WuQi <K, T> item = container[k];
         //更新元素的访问数和最后访问时间
         item.hits++;
         item.d_lastaccesstime = DateTime.Now;
         return(item.t_value);
     }
     else
     {
         getall = 0;
     }
     return(default(T));
 }
        /// <summary>
        /// 更新一个对象
        /// </summary>
        /// <param name="t">对象的值</param>
        /// <param name="k">对象的键</param>
        /// <returns></returns>
        public bool Update(K k, T t)
        {
            int rollback = 0;//设置回滚标记;用来同步数据库操作和内存操作
            CCacheItem_WuQi <K, T> backT = null;

            try
            {
                obj_rwl.AcquireWriterLock(System.Threading.Timeout.Infinite);
                //在对象集合中寻找,此处不需要过期策略
                if (false != this.obj_containers.Contains(k))
                {
                    backT = this.obj_containers[k];
                    this.obj_containers[k] = new CCacheItem_WuQi <K, T>(k, t);
                    rollback = 1;
                }
                //从数据库中更新,如果成功将回滚置1
                //该操作将同时更新该对象的所有数据项,而没有排除不需要更新的数据项;
                //所以该操作要求数据库表存储在一个数据服务器上。
                //不适用于分布式服务器,因为分布式服务器常采用分表策略,该操作将大大降低效率。
                if (false == UpdateDB(k, t))
                {
                    this.obj_containers[k] = backT;
                }
            }
            catch (System.Exception e)
            {
                //如果回滚标志置1
                if (0 != rollback)
                {
                    this.obj_containers[k] = backT;
                }
                CExceptionContainer_WuQi.ProcessException(e);
                throw e;
            }
            finally
            {
                obj_rwl.ReleaseWriterLock();
            }
            return(true);
        }
Beispiel #6
0
 public bool Insert(K k, CCacheItem_WuQi <K, T> item, ref ICacheStorage_WuQi <K, T> container)
 {
     return(true);
 }
Beispiel #7
0
 /// <summary>
 /// 设置存储项
 /// </summary>
 /// <param name="key">存储项的健值</param>
 /// <param name="value">存储的对象</param>
 /// <remarks>
 /// 仅针对存在存储项,若不存在,则不进行任何操作
 /// </remarks>
 public void Set(K key, CCacheItem_WuQi <K, T> obj)
 {
     this.obj_cache[key] = obj;
 }
Beispiel #8
0
 /// <summary>
 /// 添加一项到存储器中
 /// </summary>
 /// <param name="key">存储项的健值</param>
 /// <param name="value">存储的对象</param>
 /// <remarks>
 /// 如果存在相同的健值,则更新存储的对象
 /// </remarks>
 public void Add(K key, CCacheItem_WuQi <K, T> obj)
 {
     this.obj_cache.Add(key, obj);
 }