为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);
posted @ 2013-08-19 10:55  有你便是晴天  阅读(256)  评论(0编辑  收藏  举报