C# 缓存使用

步骤一:(数据库两种方式,轮询、直接通知)SqlDependency和SqlCacheDependency缓存

注意return回来是地址需要用.Clone()进行浅层拷贝。不然容易修改缓存内容。

sql数据库必须开启ServiceBroker服务,首先检测是否已经启用ServiceBroker,检测方法:

 Select  DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled')

--1表示已经启用0表示没有启用

步骤二:

如果ServiceBroker没有启用,使用下面语句启用:

ALTER DATABASE 数据库名 SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE 数据库名 SET ENABLE_BROKER;

步骤三:

在实现基于服务的SQL数据缓存依赖程序中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。

SqlDependency.Start(connectionString);//程序开始时调用一次

SqlDependency.Stop(connectionString);//程序退出是调用一次

CREATE VIEW 视图名

AS 子查询

步骤四:

private void buttonCache_Click(object sender, EventArgs e)
{
            ObjectCache cache = MemoryCache.Default;
            Server s = (Server)cache["OneServer"];
            if (s == null)
            {
                string sql = string.Format("select [ID],[IP],[Port],[Name] from [dbo].[Server] where [ID]={0}", int.Parse(textBoxID.Text));
                CacheItemPolicy policy = new CacheItemPolicy();
                SqlDependency.Start(conStr);
                using (SqlConnection dbc = new SqlConnection(conStr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, dbc))
                    {
                        cmd.Notification = null;
                        SqlDependency dep = new SqlDependency();
                        dep.AddCommandDependency(cmd);
                        dbc.Open();
                        SqlDataReader reader = cmd.ExecuteReader();
                        if (reader.Read())
                        {
                            s = new Server()
                            {
                                ID = Convert.ToInt32(reader["ID"]),
                                IP = (string)reader["IP"],
                                Port = Convert.ToInt32(reader["Port"]),
                                Name = (string)reader["Name"]
                            };
                            reader.Close();
                        }
                        SqlChangeMonitor monitor = new SqlChangeMonitor(dep);
                        policy.ChangeMonitors.Add(monitor);
                    }
                }
                cache.Add("OneServer", s, policy);
                s = (Server)cache["OneServer"];
            }
            s = (Server)cache["OneServer"];
        }

 

注意:

使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀)例如:select * from table1,select column1 from table1,select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。

2. 设置WebConfig      

  • <connectionStrings>
  •   <add  name="mySqlServer" connectionString="Server=192.168.30.220\SQL2K;Database=pubs;uid=sa;pwd=sa;"/> 
  • </connectionStrings>
  • <caching>
  •  <sqlCacheDependency enabled="true">
  •    <databases>
  •       <add
  •           connectionStringName="mySqlServer"
  •           pollTime="500" />
  •    </databases>
  •  </sqlCacheDependency>
  • </caching>

name:必须是数据库的名字

connectionStringName:连接字符串的名称

除了可以建立数据库依赖,还可以建立文件依赖或者其他依赖。

SqlCacheDependency的用法

SqlCacheDependency的使用需经过几个具体的设置步骤:

该实例中,SqlCacheDependency缓存依赖该数据表,即如果表中数据发生了变化,缓存应该失效。

1. 修改web.config,启用SqlCacheDependency。将下列代码加入web.config的<system.web>节:

  • <caching>
  •     <sqlCacheDependency enabled="true">
  •         <databases>
  •             <add connectionStringName="regex_libConnectionString" name="IPBlockedDependency"/>
  •         </databases>
  •     </sqlCacheDependency>
  • </caching>

这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。

2. 执行下述命令,为数据库启用缓存依赖:

  • C:\Program Files\Microsoft Visual Studio 9.0\VC>aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"这里-C后面的字符串是连接字符串(请替换成自己所需要的值),-t参数后面的字符串是数据表的名字。命令执行后,数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。

3. 在代码中使用缓存,并为其设置SqlCacheDependency依赖:

  • private static string[] GetBlockedIPs()
  • {
  •     // 1尝试从缓存中读取
  •     string[] ips = (string[])HttpContext.Current.Cache[BlockedIPCacheKey];
  •     if (ips != null)
  •         return ips;
  •     // 2从数据库中读取
  •     using (RxDataContext db = new RxDataContext())
  •     {
  •         ips = db.IPBlockeds.Select(ipb => ipb.UserIP).ToArray();
  •     }
  •     // 3放入缓存
  •     SqlCacheDependency depend = new SqlCacheDependency("IPBlockedDependency", "IPBlocked");
  •     HttpContext.Current.Cache.Insert(BlockedIPCacheKey, ips, depend);
  •     return ips;
  • }

创建SqlCacheDependency时需要指定web.config中定义的SqlCacheDependency名字,并指定数据表的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值