[转]C#基础回想:Asp.net 缓存

本文转自http://www.cnblogs.com/stg609/archive/2009/03/22/1418992.html

//判断dataset是还是不是为空,借使为空,表达没有在缓存中。
if (ds == null)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[“NorthwindConnectionString”].ConnectionString);
    conn.Open();
    SqlCommand cmd = new SqlCommand(“select * from products where CategoryID = 1”, conn);
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    ds = new DataSet();
    sda.Fill(ds);
    Cache[“data”] = ds;//将dataset插入到Cache对象中
}

      假若整个安顿结束,就能够看效果了。你会发现只有当数码被更新的时候,才会更新缓存。这么些效应分明比后面两种办法来得更好,不过也不能够联接的接纳这种格局,毕竟轮询依旧会负出一些代价的。
     
[注,上述配置进程中所涉及到的片段数据库名称、表名称,大小写一定要前后一致,不然或者会编写翻译失利。]

为 SQL 缓存注重项启用该数据库。
.
已完成。
为 SQL 缓存依赖项启用该表。

      示例4:      
是或不是觉得通过这种措施落到实处的有些缓存、部分刷新的功能有过多受制。借使急需一种更灵敏的法子来促成都部队分缓存的效益,可以通过用户控件来兑现。正是说,大家将供给被缓存的数码单独放置在一个页面中,然后在该页面上服从我们前边多少个例证所介绍的章程进行安装。最终把设置好的用户控件拖动到最终的页面上就足以了。其余,OutputCache指令中还有一个Shared属性,设置该属性为true就意味着共享该控件的出口缓存。

      示例5:
     
ASP.NET还提供了一种更方便人民群众的措施,能够对页面包车型地铁变量举办缓存。即接纳Cache对象。一般用来缓存数据变量,如DataSet。可是,倘使数据量相比较大的话,建议与硬盘缓存结合起来使用。一般采纳Cache对象来保存数据库数据能够比采取OutputCache配置品质更好。然而最为不要用Cache来存放用户的登陆音讯等等,因为缓存中的数据随时都有或者被替换出内部存储器(倘若你左右一些关于电脑组成方面包车型客车规律,可能会更好驾驭)。

作者:stg609

     
要采纳轮询方式,需安排数据库,配置的首要职分正是在数据库中树立一张表和部分触发器,在那么些表中存放的是大家须求轮询的数目库表对象及其有关消息,触发器自然是用来当所监视的表产生变化的时候实施了。幸而,这一多元操作我们只要求用几句简单的吩咐就可以消除了。不然的话,笔者恐怕就会停顿了。
      打开Vsiual studio的通令提醒窗口,输入:
      aspnet_regsql.exe -S <Server> -U <Username> -P
<Password> -ed -d <Database> -et -t <TableName>
      如:aspnet_regsql.exe -S .\msserver -U sa -P sa -ed -d Northwind
-et -t products
      即便运维成功,会提醒:

      进入正题(本身从未深刻商量,如有不足之处,希望大家不吝赐教)

     
在那之中的name只必要是二个有益回想的名字(一般就记作数据库的称谓),pollTime便是轮询时间(单位:阿秒)。
      [引用MSDN中的一段话:小的 pollTime
值固然使对数据库的请求次数增多,但能更快的将过时数据从缓存中排除。较大的
pollTime
值纵然减弱了对数据库的呼吁次数,但扩充了从后台数据变动到清除相关缓存条目之间的延迟时间。万幸,数据库请求只是进行2个不难的储存进程,该存款和储蓄进程只是从一个简约的笔录数少的表重返不多的几行。对你的应用程序试用一些不比的
pollTime
值,从中找出三个可平衡数据库访问和数据过时那二者的理想值。允许的蝇头
pollTime 值为 500 。]
    
 connectionStringName就是<connectionStrings>节中所配置的数据库连接名称。如:

      示例3:      
要是必要部分不被缓存,能够应用劳务器端控件Substitution。操作很简单,只须求将该控件拖动到页面上,然后设置一下之中的MethodName属性就足以了。
     
该控件编写翻译成Html后,不带任何标志,就像是同是一个占位符。其中显示的是内容是由MethodName所钦定的措施。然而该措施有早晚的界定:
      1:静态方法。
      2:只接受HttpContext 类型的参数。
      3:必须回到 string 类型的值。
      如:

      那样,每便页面刷新后就可以赢安妥前的年月,而别的数据则是被缓存的。

 缓存的功力
     
你买电脑的时候,是还是不是会在意CPU的二级缓存?是还是不是期望二级缓存能够大点?那您有没有想过你为什么会有那种想法?说到底,便是为了质量难点,假如缓存大点,那就表示大家处理数据的响应速度会更快。那就好比大家查字典,如若有二个单词,你要求精晓它的意思,你是否急需查阅字典,查找目录,翻到钦命的页,找到您要的单词,那才能获得该词的演讲?可是不幸的是,你并从未想要去记住这么些词,当第②遍碰着那些词的时候,你是否又得重新三次上述的动作?要是您当时言犹在耳这一个单词,那是否及时就能领会这几个词的情趣了?那是否很高效?
      缓存的短处      
若是让你在三个信息无法转达的地方(比如原始森林)呆上多少个月,而那多少个月初,发生了不少浮动,当中之一正是你上次查询的不胜单词由于某个特殊的缘由,它的解说被撤换了。而你肯定不通晓那些事情,如若此时此刻,让你解释那个单词,你是还是不是会闹笑话?那是何许来头呢?非常的粗略,因为你的脑英里只保留着上次的解说,而从不当即获得更新。

 

图片 1
 <connectionStrings>
  <add name=”NorthwindConnectionString” connectionString=”Data Source=1AC425E4D0B74F1\msserver;Initial Catalog=Northwind;Integrated Security=True”
   providerName=”System.Data.SqlClient” />
 </connectionStrings>

<%@ OutputCache Duration=”10″ VaryByParam=”CategoryiD” Shared=”true”%>

      上述重大有七个本性(要布局缓存至少须要那五个属性):
     
Duration用来定义页面被缓存的岁月(单位为秒),也正是说在10秒内,重复访问那些页面将获得完全等同的数码。
     
VaryByParam表示是不是因为承受请求的参数(xxx.aspx?id=1)而变更,假诺设置为none,表示不改变。
      那样,2个最简单易行的缓存效果便能够实现了。

图片 2
//从Cache对象中拿走相应的dataset
DataSet ds = (DataSet)Cache[“data”];

图片 3
<caching>
  <sqlCacheDependency enabled = “true” pollTime = “1000” >
    <databases>
      <add name=”Northwind” 
         connectionStringName=”NorthwindConnectionString”
         pollTime = “1000” />
    </databases>
  </sqlCacheDependency>
</caching>

      示例1:      
你希不指望你的动态网站也有叁个方可回忆的大脑?只怕有个别朋友会认为可笑,“那有须要吗?”
。假如您的网站牵涉到大批量的数额交互,而那个数据被更新的频率又不是很高,比如有些提供音讯资源音信的站点,可能就只供给在上午9:00前对情报拓展立异,而后就不须要再转移了。那也正是说9点后用户访问所取得的数码都以平等的。可是,因为尚未提供缓存的能力,用户的每一趟访问,依然会导致服务器端对数据库的造访,那会不会很影响属性?
      在Asp.net
webform中能够透过布置页面指令OutputCache来完成效益。在您的aspx文件的头顶参与如下的话语:

<%@ OutputCache Duration=”10″ VaryByParam=”none”%>

GridView1.DataSource = ds;
GridView1.DataBind();

      **示例2:
**     
通过地点的例证,相信您已经领略到了缓存的吸重力。可是,下面的效益不可能依据页面的参数进行缓存,也正是说不管笔者传什么参数给页面,展现的都以一样的。比如作者在10秒内先后访问xxx.aspx?id=1与xxx.aspx?id=2,其出示的效率是一致的。如若期待依据参数举办缓存,只要让VaryByParam=”id”就能够了(大小写无关)。那样就会依据id的值不一致而个别缓存,也正是缓存了页的三个不相同的本子。

正文版权归我和天涯论坛共有,欢迎转载,但未经小编同意必须保留此段注脚,且在篇章页面鲜明地点给出原来的书文连接,不然保留追究法律义务的任务。

     
然后,设置与SqlDependency相关的部分音信(如,轮询时间),这个音讯在web.config中开始展览安装:

public static string GetCurrentTime(HttpContext context)
{
    return DateTime.Now.ToString();
}

      参考:
      1.苏鹏先生讲的“asp.net2.0缓存与品质”
      2.vs2005入门 之 Substitution
[视频]

      3.Asp.net
缓存技术总计

      4.将 ASP.NET 输出缓存与 SQL Server
结合使用
.aspx)
      5.选取 SQL
缓存依赖项

      示例6:
     
然而地方格局总有点不足,假设当数码变动的时候就自动更新缓存,那不是更好。那足以有二种达成方式,文告和轮询。不过MSDN上介绍“公告”的效用唯有在Microsoft
SQL Server 2006 的总体版,即非速成 (non-Express)
版中才有提供。而别的版本则只提供了轮询格局,况且作者也只会轮询格局,所以就来大致介绍下该方法呢。

      最终修改OutputCache指令中的Duration为”999999″用来代表无比,再投入一本质量SqlDependency,设置该属的值为”database,tableName”。当中database为Web.config
中 <add> 成分的name
属性中内定的数据库名。以Northwind的products表为例就应当创作:SqlDependency=”诺思wind:products”。假诺有两张表就编写:database:tableName;database2:tableName2。

      示范打包下载 

笔者博客已经转移到Charley Blog

相关文章