在《他舅网wap流量统计分析平台》开发中为了提高系统的性能我们利用Cache来保存数据例如把用户的一些权限信息放在Cache中但这样做会有些问题何时清除Cache与数据保持同步下面我在项目中使用Cache的心得与大家分享 一利用CacheDependency类 它在命名空间SystemWebCaching中CacheDependency类会与文件之间建立依附性关系在文件更改时该Cache项会自动移除 方法: 把用户权限信息保留成XML文件当管理员更新数据时同时更新这个XML文件 代码 //Cahce值为XML文件内容 XmlDocument doc = Cache[user] as XmlDocument; if (doc == null) { doc = new XmlDocument(); string filePath = ServerMapPath(userxml); //建立依赖项 CacheDependency c = new CacheDependency(filePath); docLoad(filePath); //建立依赖关系 CacheInsert(skin doc c CacheNoAbsoluteExpiration TimeSpanFromMinutes() ); } 二利用SqlCacheDependency类 它也在命名空间SystemWebCaching中SqlCacheDependency会与数据库表或SQL Server查询结果建立依赖关系这种方法操作比较复杂 步聚: 在WebConfig文件中增加数据库连接串与Cache配置节点 <configuration> <appSettings/> <connectionStrings> <add name=connStr connectionString=server=;uid=sa;pwd=l;database=CacheTest;/> </connectionStrings> <systemweb> <caching> <sqlCacheDependency> <databases> <!节点connectionStringNam的值connStr必须与上面定义的连接串节点name的值相同> <add name=entryName connectionStringName=connStr pollTime=/> </databases> </sqlCacheDependency> </caching> </systemweb> </configuration> 步聚: 在Globalasax文件中填加代码目地是在应用程序端启用依赖监听器该方法的参数为数据库的连接字符串 void Application_Start(object sender EventArgs e) { SystemDataSqlClientSqlDependencyStart(ConfigurationManagerConnectionStrings[connStr]ConnectionString); } void Application_End(object sender EventArgs e) { SystemDataSqlClientSqlDependencyStop(ConfigurationManagerConnectionStrings[connStr]ConnectionString); } 步聚: 定义数据库依赖项 String CacheName = CacheName ; String strconnection = ConfigurationManagerConnectionStrings[connStr]ConnectionString; DataTable table = new DataTable(); if(Cache[CacheName] == null) { SqlConnection conn = new SqlConnection(strconnection); SqlCommand cmd = new SqlCommand( select * from dbouser conn); cmdCommandType = CommandTypeText; //这时非常重要 SqlCacheDependency dep = new SqlCacheDependency(cmd); SqlDataAdapter adp = new SqlDataAdapter(cmd); connOpen(); adpFill(table); connClose(); TimeSpan ts = new TimeSpan( ); //建立依赖 CacheAdd(CacheName table dep CacheNoAbsoluteExpiration ts CacheItemPriorityHigh null); } else { table = (DataTable)Cache[CacheName]; } 步聚: 启用 SQL 缓存依赖项 运行 Aspnet_regsqlexe文件目录在C:\WINDOWS\MicrosoftNET\Framework\<你的Framework版本号文件夹>\aspnet_regsqlexe 输入命令行aspnet_regsqlexe S <服务器名称> U <用户名> P <密码> ed d 数据库名 et t 表名 执行完命令后系统自动会在相应的数据库中增加了一些存储过程这样就全部完成了 心得 第一种方法使用简单方便在本项目中经常使用 第二种方法对SQL语名限制较严格不能带有Where关键字也不能用存储过程如果您知道解决方法请分享 转自他舅平台 |