关于数据库依赖缓存的SqlCacheDependency的demo
对于数据库依赖缓存既从数据库中取出表中的数据放入缓存中待遇到对表中的数据进行增删改的时候在重新更新缓存(郁闷的是.net好像是直接把原来放表的缓存直接给删掉了)!在数据查询量比较大的时候(例如涉及几个表的联合查询的情况)数据库依赖缓存还是比较有价值的东西的!
首先先要为数据库启用缓存依赖项执行下属命令
下面就可以在代码中设置数据库依赖了使用System.Web.Caching.SqlCacheDependency
首先在Web.config中进行配置
其中GridView 用于显示Category中的数据
Button 用于触发更新Category表中的数据的事件
Label 用于显示缓存中的数据
后台代码首先先要为数据库启用缓存依赖项执行下属命令
Code
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
aspnet_regsql -C "data source=127.0.0.1;initial catalog=new;user id=sa;password=" -ed -et -t "Category"
//其中的new 为数据库名称
//其中的Category为new中的一个表
//即为数据库new中的Category表建立数据库依赖
//参数-C后面的字符串是连接字符串(请替换成自己所需要的值)参数-t后面的字符串是数据表的名字。
建立成功后会在数据库中多出一个名为AspNet_SqlCacheTablesForChangeNotification的表如下图所示C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
aspnet_regsql -C "data source=127.0.0.1;initial catalog=new;user id=sa;password=" -ed -et -t "Category"
//其中的new 为数据库名称
//其中的Category为new中的一个表
//即为数据库new中的Category表建立数据库依赖
//参数-C后面的字符串是连接字符串(请替换成自己所需要的值)参数-t后面的字符串是数据表的名字。
下面就可以在代码中设置数据库依赖了使用System.Web.Caching.SqlCacheDependency
首先在Web.config中进行配置
Code
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=new;user id=sa;password=;" providerName="System.Data.SqlClient" />
</connectionStrings>
<!--数据库连接字符串-->
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheTest" duration="50" />
</outputCacheProfiles>
</outputCacheSettings>
<sqlCacheDependency enabled="true" pollTime="6000">
<!--对sqlCacheDependency进行配置pollTime属性为系统自动每隔时间进行更新缓存中的数据-->
<databases>
<add name="codematic" connectionStringName="strcodematic" />
</databases>
<!--其中connectionStringName应与连接字符串中的connectionStringName一致-->
</sqlCacheDependency>
<!--如果是SqlServer2005的话,则只需如下设置,因为SqlServer支持基于通知的缓存失效-->
<!--<sqlCacheDependency enabled="true" />-->
</caching>
<compilation debug="true">
</compilation>
<authentication mode="Windows"/>
</system.web>
</configuration>
下面就可以在代码中实现数据依赖了!!以下是页面前台的显示代码 页面上只有一个GridView 和Button 和一个Label<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=new;user id=sa;password=;" providerName="System.Data.SqlClient" />
</connectionStrings>
<!--数据库连接字符串-->
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheTest" duration="50" />
</outputCacheProfiles>
</outputCacheSettings>
<sqlCacheDependency enabled="true" pollTime="6000">
<!--对sqlCacheDependency进行配置pollTime属性为系统自动每隔时间进行更新缓存中的数据-->
<databases>
<add name="codematic" connectionStringName="strcodematic" />
</databases>
<!--其中connectionStringName应与连接字符串中的connectionStringName一致-->
</sqlCacheDependency>
<!--如果是SqlServer2005的话,则只需如下设置,因为SqlServer支持基于通知的缓存失效-->
<!--<sqlCacheDependency enabled="true" />-->
</caching>
<compilation debug="true">
</compilation>
<authentication mode="Windows"/>
</system.web>
</configuration>
其中GridView 用于显示Category中的数据
Button 用于触发更新Category表中的数据的事件
Label 用于显示缓存中的数据
Code
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="插入" onclick="Button_Click" />
</div>
</form>
</body>
</html>
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="插入" onclick="Button_Click" />
</div>
</form>
</body>
</html>
Code
protected void Page_Load(object sender, EventArgs e)
{
//判断缓存中是否存在Category
if (HttpRuntime.Cache["Category"] == null)//不存在则
{
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
//对GridView1 进行数据绑定
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "Category");
//声明SqlCacheDependency其中构造函数中的这两个参数(codematic必需与WebConfig配置的sqlCacheDependency的一致,Category则是缓存的key)
HttpRuntime.Cache.Insert("Category", DateTime.Now.ToString(),
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
null);
//向缓存集合中插入数据(为了直观我们在缓存中放入的是当前时间当更改表Category时则重新更改缓存中的时间)
this.Label1.Text = HttpRuntime.Cache["Category"].ToString();
//显示缓存Category中的数据
}
else//存在则把缓存数据显示到页面
{
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
this.Label1.Text = HttpRuntime.Cache["Category"].ToString();
}
}
protected void Button_Click(Object sender, EventArgs e)
{
InsertData();// 修改Category表中的数据
this.Label1.Text = HttpRuntime.Cache["Category"].ToString(); //显示缓存中的内容
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
}
private SqlCommand returncommand(string CommandText)
{
/* 连接数据库*/
string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["strcodematic"].ConnectionString.ToString();
SqlConnection conn = new SqlConnection(connstring);
using (SqlCommand cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = CommandText;
return cmd;
}
}
private DataSet BindData()
{
/* 读出表中的数据*/
SqlCommand cmd=returncommand("SELECT * FROM Category");
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds;
}
private string GetData()
{
/* 筛选出CategoryID=6 的 Description值*/
SqlCommand cmd = returncommand("SELECT Description FROM Category where CategoryID=6");
return cmd.ExecuteScalar().ToString();
}
private void InsertData()
{
/* 更新表内容*/
if (GetData() != "222")
{
SqlCommand cmd = returncommand("Update Category set Description=222 where CategoryID=6");
cmd.ExecuteNonQuery();
}
}
当对数据表中的数据不进行更新时刷新页面页面中的时间是不会变的protected void Page_Load(object sender, EventArgs e)
{
//判断缓存中是否存在Category
if (HttpRuntime.Cache["Category"] == null)//不存在则
{
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
//对GridView1 进行数据绑定
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "Category");
//声明SqlCacheDependency其中构造函数中的这两个参数(codematic必需与WebConfig配置的sqlCacheDependency的一致,Category则是缓存的key)
HttpRuntime.Cache.Insert("Category", DateTime.Now.ToString(),
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
null);
//向缓存集合中插入数据(为了直观我们在缓存中放入的是当前时间当更改表Category时则重新更改缓存中的时间)
this.Label1.Text = HttpRuntime.Cache["Category"].ToString();
//显示缓存Category中的数据
}
else//存在则把缓存数据显示到页面
{
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
this.Label1.Text = HttpRuntime.Cache["Category"].ToString();
}
}
protected void Button_Click(Object sender, EventArgs e)
{
InsertData();// 修改Category表中的数据
this.Label1.Text = HttpRuntime.Cache["Category"].ToString(); //显示缓存中的内容
this.GridView1.DataSource = BindData();
this.GridView1.DataBind();
}
private SqlCommand returncommand(string CommandText)
{
/* 连接数据库*/
string connstring = System.Configuration.ConfigurationManager.ConnectionStrings["strcodematic"].ConnectionString.ToString();
SqlConnection conn = new SqlConnection(connstring);
using (SqlCommand cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = CommandText;
return cmd;
}
}
private DataSet BindData()
{
/* 读出表中的数据*/
SqlCommand cmd=returncommand("SELECT * FROM Category");
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds;
}
private string GetData()
{
/* 筛选出CategoryID=6 的 Description值*/
SqlCommand cmd = returncommand("SELECT Description FROM Category where CategoryID=6");
return cmd.ExecuteScalar().ToString();
}
private void InsertData()
{
/* 更新表内容*/
if (GetData() != "222")
{
SqlCommand cmd = returncommand("Update Category set Description=222 where CategoryID=6");
cmd.ExecuteNonQuery();
}
}
但点击插入对数据库进行更新时候则重新写缓存缓存中写入的是当前时间!!