为ASP_NET应用程序启用SQL缓存
步骤一:
sql数据库必须开启ServiceBroker服务,首先检测是否已经启用ServiceBroker,检测方法:
SELECT DATABASEPROPERTYEX('dbName','IsBrokerEnabled') --1表示已经启用,0表示未启用
如果是创建的新数据库,默认是已启用(1)。如果还原数据库,默认是未启用(0)。
步骤二:
如果ServiceBroker没有启用,使用下面语句启用:
ALTER DATABASE dbName SET ENABLE_BROKER;
此行此语句时有可能时间会很长,对此可以重启SQL查询编辑再执行以上语句。
步骤三:
如果使用的是SQL Server 2005/2008版本数据库,只需在Page_Load或者Application_Start使用如下语句即可启用ASP.NET对应的SQL缓存:
SqlCacheDependencyAdmin.EnableNotifications(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
对于使用更低版本需要使用aspnet_regsql来配置。
另外,在最初时使用的是如下语句:
String[] tables = ConfigurationManager.AppSettings["CacheDataTable"].Split(','); SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString, tables);
在使用上面的语句始终报异常:没有为 SQL 缓存通知启用数据库(不知道为什么)
步骤四:
通过以上步骤就可以编写相应的缓存代码,代码如下:
public class TableDependency { protected char[] configurationSeparator = 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(configurationSeparator); foreach (string tableName in tables) dependency.Add(new SqlCacheDependency(dbName, tableName));//把表以及对应的数据库添加到AggregateCacheDependency对象中 } public AggregateCacheDependency GetDependency() { return dependency; } }
String PHONE_HEAD_KEY="User_{0}"; String cacheKey = String.Format(PHONE_HEAD_KEY, ID);//缓存键 String data = (String)HttpRuntime.Cache[cacheKey];//首先从缓存来获取相应的数据 if (data == null) { //从数据库获取 data = db.GetData(); //获取一个AggregateCacheDependency对象,UserTableDependency保存的是表 AggregateCacheDependency cd = new TableDependency("UserTableDependency").GetDependency(); //添加到缓存 HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(10), Cache.NoSlidingExpiration, CacheItemPriority.High, null); } Response.Write(data);
因本人技术有限,现阶段仅用作记录收藏他人作品。