这个Cache基本上是仿照PetShop4.0写的,看一下逻辑层的一段代码,感觉命中率好低啊!        public DataTable SelectLsgInfo()
        {
            DataTable myTable = (DataTable)HttpRuntime.Cache[LSG_INFO_WHB];
            if (myTable == null)
            {
                sql = "select lingshigong.id,lsgname,phone,duiname,bianhao from lingshigong, duiinfo where lingshigong.dui_id = duiinfo.id";
                myTable = DbLink.ExecuteDataTable(linkstr1, sql, CommandType.Text);
                AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
                HttpRuntime.Cache.Add(LSG_INFO_WHB, myTable, cd, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30), CacheItemPriority.Low, null);
            }            return myTable;
        }==============================================
谢谢各位大虾了!肯定是偶的程序没写好,请大家多帮帮忙.

解决方案 »

  1.   

    怎么知道命中率的?程序每次重新编译执行cache肯定都是空的.
    如果有问题,别的好象都看不到明显的问题,那问题可能出在这里:
      AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
      

  2.   

      AggregateCacheDependency cd = DependencyFacade.GetLsgCache(); 
    这个语句是获取依赖关系的,跟PetShop的一样...
    调试程序,第一次Cache是空的,从数据库读数据,Cache不是空了吧.但是下次使用的时候还是从数据库里面取数据,Cache几乎没有用!
      

  3.   

    我写了段代码测试,
            public DataTable SelectLsgInfo()
            {
                DataTable myTable = (DataTable)HttpRuntime.Cache[LSG_INFO_WHB];
                if (myTable == null)
                {
                    sql = "select lingshigong.id,lsgname,phone,duiname,bianhao from lingshigong, duiinfo where lingshigong.dui_id = duiinfo.id";
                    myTable = DbLink.ExecuteDataTable(linkstr1, sql, CommandType.Text);
                    AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
                    HttpRuntime.Cache.Add(LSG_INFO_WHB, myTable, cd, DateTime.Now.AddMinutes(40), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                    
                    //测试Cache没有命中的次数
                    StreamReader MyReader = new StreamReader(@"C:\1.txt");
                    int num = Int32.Parse(MyReader.ReadLine());
                    MyReader.Close();
                    num++;
                    StreamWriter MyWriter = new StreamWriter(@"C:\1.txt");
                    MyWriter.WriteLine(num.ToString());
                    MyWriter.Close();
                }            return myTable;
            }=====================================
    我在客户端执行的时候,发现只要我在同一个页面不执行数据更改操作,一直查询数据,除了第一次载入页面,要查询数据库的,第二次,第三次等等都是从Cache里面取值,
    但是问题来了,我切换到下一个页面,然后在切换回来,就不能从Cache里面取值了,需要查询数据库,可是我并没有进行数据更改操作,这是为什么呢?
      

  4.   

    这不可能,你的代码可以看到先从Cache取数据,取不到才从数据库取,怎么可能没用呢?
    问题有可能在这里,AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
    你看看Cache的依赖项是否每次都发生变化吧。
    如果你的项目不需要Cache,也可以取消它嘛。
      

  5.   

    还有用同一个帐户登陆一次,载入一下页面,这个要查询数据库放到Cache里面的,然后马上退出,在用这个帐户登陆一次,
    载入同一个页面,这次还是要查数据库,并没有从Cache里面取值啊?这是为什么呢?
    ===================================================================
    偶程序没写好呢?
      

  6.   


    using System.Web.Caching;
    //接口定义
    namespace ICacheDependency
    {
        public interface IqywhCacheDependency
        {
            AggregateCacheDependency GetDependency();
        }
    }using System.Web.Caching;
    using System.Configuration;namespace TableCacheDependency
    {
        public abstract class TableDependency : ICacheDependency.IqywhCacheDependency
        {
            protected char[] split = new char[] { ','};
            protected AggregateCacheDependency dependency = new AggregateCacheDependency();        protected TableDependency(string configKey)
            {
                string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
                string tableConfig = ConfigurationManager.AppSettings[configKey];
                string[] tables = tableConfig.Split(split);            foreach (string tableName in tables)
                {
                    dependency.Add(new SqlCacheDependency(dbName, tableName));
                }
            }        public AggregateCacheDependency GetDependency()
            {
                return dependency;
            }
        }
    }using System;
    using System.Collections.Generic;
    using System.Text;namespace TableCacheDependency
    {
        public class linshigong : TableDependency
        {
            public linshigong() : base("lsg") { }
        }
    }using System.Reflection;
    using System.Configuration;
    using ICacheDependency;namespace CacheDependencyFactory
    {
        public static class DependencyAccess
        {
            public static IqywhCacheDependency CreateWlbgDependency()
            {
                return LoadInstance("wangluobg");
            }        public static IqywhCacheDependency CreateLsgDependency()
            {
                return LoadInstance("linshigong");
            }        private static IqywhCacheDependency LoadInstance(string className)
            {
                string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
                string fullClassName = path + "." + className;            return (IqywhCacheDependency)Assembly.Load(path).CreateInstance(fullClassName);
            }
        }
    }using System.Configuration;
    using System.Web.Caching;
    using System.Collections.Generic;
    using ICacheDependency;namespace CacheDependencyFactory
    {
        public static class DependencyFacade
        {
            private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];        /// <summary>
            /// 获取网络办公Cache关联
            /// </summary>
            /// <returns></returns>
            public static AggregateCacheDependency GetWlbgCache()
            {
                if (!string.IsNullOrEmpty(path))
                {
                    return DependencyAccess.CreateWlbgDependency().GetDependency();
                }
                else
                {
                    return null;
                }
            }        /// <summary>
            /// 获取临时工Cache关联
            /// </summary>
            /// <returns></returns>
            public static AggregateCacheDependency GetLsgCache()
            {
                if (!string.IsNullOrEmpty(path))
                {
                    return DependencyAccess.CreateLsgDependency().GetDependency();
                }
                else
                {
                    return null;
                }
            }
        }
    }====================
    基本上是比对PetShop写的.
      

  7.   

         <add key="lsg" value="lingshigong,duiinfo" />
    webconfig做的依赖项,这个需要监控lingshigong和duiinfo这两个表