这个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;
}==============================================
谢谢各位大虾了!肯定是偶的程序没写好,请大家多帮帮忙.
{
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;
}==============================================
谢谢各位大虾了!肯定是偶的程序没写好,请大家多帮帮忙.
如果有问题,别的好象都看不到明显的问题,那问题可能出在这里:
AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
这个语句是获取依赖关系的,跟PetShop的一样...
调试程序,第一次Cache是空的,从数据库读数据,Cache不是空了吧.但是下次使用的时候还是从数据库里面取数据,Cache几乎没有用!
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里面取值了,需要查询数据库,可是我并没有进行数据更改操作,这是为什么呢?
问题有可能在这里,AggregateCacheDependency cd = DependencyFacade.GetLsgCache();
你看看Cache的依赖项是否每次都发生变化吧。
如果你的项目不需要Cache,也可以取消它嘛。
载入同一个页面,这次还是要查数据库,并没有从Cache里面取值啊?这是为什么呢?
===================================================================
偶程序没写好呢?
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写的.
webconfig做的依赖项,这个需要监控lingshigong和duiinfo这两个表