SQL缓存依赖,可以将数据库中的数据放入Cache缓存中缓存,既当数据库中有相应的更新,程序也会及时监听到,并获取更新最新的缓存版本。
- 优点:能直接从缓存中取数据,加快了程序的执行效率。
- 缺点:不能进行分层,增大了程序的耦合性,难以维护。另外,需要注意的细节很多,稍有不慎,就无法起作用。
下面,上代码。
首先,一个用来测试的简单页面,三个控件,Label1,GridView1,Button1。
样例输出:如果是从数据库中读取数据,则Label1显示:"Come from database".如果是从Cache中取出的数据,则Label1显示:"Come from Cache"
注:Button1中没有写任何代码,在此仅作刷新页面使用。protected void Page_Load(object sender, EventArgs e) { //因为只是测试,所以 只在Page_Load中写了代码。 //每次Button1被点击时,都会进入此事件。 List<Goods> list = (List<Goods>)Cache["Goods"]; if (list == null)//判断Cache中是否有数据 { list = new List<Goods>(); string str = "server=.;database=Practice;integrated security=true;"; using (SqlConnection sql = new SqlConnection(str)) { sql.Open(); string text = "select g_id,g_name,g_type,g_single from dbo.Goods"; using (SqlCommand scmd = new SqlCommand(text, sql)) { //下面这句是建立数据库与asp.net之间的缓存依赖 SqlCacheDependency depend = new SqlCacheDependency(scmd); using (SqlDataReader dr = scmd.ExecuteReader()) { //读取数据 while (dr.Read()) { Goods goods = new Goods(); goods.G_id = dr["g_id"].ToString(); goods.G_name = dr["g_name"].ToString(); goods.G_type = dr["g_type"].ToString(); goods.G_single = (int)dr["g_single"]; list.Add(goods); } } //如果,数据库中有更新,则Cache会被清空,并在下一次重新被赋值。(即最新数据) Cache.Insert("Goods", list, depend); } } Label1.Text = "Come from database"; } else Label1.Text = "Come from Cache"; GridView1.DataSource = list; GridView1.DataBind(); }
写完aspx页面,还需要在Global.asax中写两句代码。
//using System.Data.SqlClient;记得加上这个命名空间 protected void Application_Start(object sender, EventArgs e) { string str = "server=.;database=Practice;integrated security=true;";//连接字符串必须和前面的一样 SqlDependency.Start(str);//开始监听 } protected void Application_End(object sender, EventArgs e) { string str = "server=.;database=Practice;integrated security=true;"; SqlDependency.Stop(str);//结束监听 }
上面这些做完了,还需要为使用的数据库执行下面一句代码。
ALTER DATABASE 数据库名 SET ENABLE_BROKER; //允许监听,默认为关闭。
输出:当程序首次运行,Label1会显示"Come from database"
此时,再点击Button1,Label1会显示"Come from Cache",如果数据库中的数据不改变的话,则不管怎么点Button1都不会改变。
那么,当改变数据库中的数据时,再点击Button1,则Label1.Text会改变为"Come from database"。
下面,是建立Sql数据库缓存依赖需要注意的地方。
- 必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test
- 必须明确设置所访问数据库列名称,不能使用“*”。
- 必须保证不是聚合函数。如COUNT、MAX等。
(不知道为什么,我在学校没有遵守1.2条也可以。但是,回到家再做,则不行。)
最后,学习笔记,如需转载,请注明出处。