一、数据库轮询缓存依赖。
上面的步骤要我们自己动手实现起来很麻烦,没关系跟着微软混是不会吃亏滴,微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:\Windows\Microsoft.NET\Framework\v2.0.50727这个路径下(也不一定但是一般就是这个路径)
双击Aspnet_regsql.exe进行记录监控信息的表创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
启用数据库AudioManagerProduct_DB缓存依赖支持,并对TBL_AMC_scenic表启用缓存依赖,如下:
aspnet_regsql -S .-E -ed -d AudoManagerProduct_DB-et -t TBL_AMC_Scenic
1、web.config配置文件的更改。
(1)、
<connectionStrings>
<add name="ProductDB" connectionString="Data Source=192.168.1.67;
Initial Catalog=AudioManagerProduct_DB;User ID=iscenes.com;
PassWord=iscenes.com.cn"></add>
</connectionStrings>
(2)、在system.web节点下配置
<caching>
<sqlCacheDependency enabled="true" pollTime="60000">
<databases>
--每隔9秒钟就会去AudioManagerProduct_DB数据库中查询TBL_AMC_Scenic表
--是否有变化。
<add name="ProductDB" connectionStringName="ProductDB"
pollTime="90000"></add>
</databases>
</sqlCacheDependency>
</caching>
2、页面代码
publicpartialclass_Default:System.Web.UI.Page
{
protectedSystem.Text.StringBuilder sbHtml =newSystem.Text.StringBuilder();
protectedvoidPage_Load(object sender,EventArgs e)
{
List<Home> list =Cache["homeList"]asList<Home>;
//此时给缓存设置为5天过期时间,不过这期间,缓存依赖会9秒轮询一次数据库,
//如果数据库中相应的表有变动,就会自动删除缓存中数据,重新从数据库读取数据
//如果数据库中没有数据的更改,且缓存没有过期,就会从缓存中读取数据
if(list ==null)
{
Response.Write("<h3>从数据库中获得的数据</h3>");
HouseEntities houseEntities =newHouseEntities();
list = houseEntities.Home();
//基于数据库的缓存依赖
SqlCacheDependency sqldep =newSqlCacheDependency
("ProductDB","TBL_AMC_Scenic");
Cache.Insert("homeList", list, sqldep,DateTime.MaxValue,TimeSpan.FromDays(5));
}
else
{
Response.Write("<h3>从缓存获取的数据</h3>");
}
foreach(Home item in list)
{
sbHtml.Append("Id:"+ item.Id+"Name:"+ item.Name+"Address:"+ item.Address+"<br/>");
}
Response.Write(sbHtml.ToString());
}
//注意:SqlCacheDependency sqldep = new SqlCacheDependency("pubs", "Home");
}
publicclassHome
{
publicintId{get;set;}
publicstringName{get;set;}
publicstringAddress{get;set;}
}
publicclassHouseEntities
{
publicList<Home>Home()
{
List<Home> home =newList<Home>();
string strcon =System.Configuration.ConfigurationManager.
ConnectionStrings["ProductDB"].ToString();
SqlCommand sqlcom =newSqlCommand();
using(SqlConnection sqlcon =newSqlConnection())
{
sqlcon.ConnectionString= strcon;
string sql ="SELECT ScenicId,ScenicName,ProvinceName from dbo.TBL_AMC_Scenic";
DataSet dt =SqlHelper.ExecuteDataset(sqlcon,CommandType.Text, sql);
if(dt.Tables.Count>0&& dt.Tables[0].Rows.Count>0)
{
for(int i =0; i < dt.Tables[0].Rows.Count; i++)
{
Home h =newHome();
h.Id=int.Parse(dt.Tables[0].Rows[i]["ScenicId"].ToString());
h.Name= dt.Tables[0].Rows[i]["ScenicName"].ToString();
h.Address= dt.Tables[0].Rows[i]["ProvinceName"].ToString();
home.Add(h);
}
}
}
return home;
}
}
CREATE TABLE [dbo].[TBL_AMC_Scenic](
[ScenicId] [varchar](50) NULL,
[ScenicName] [varchar](50) NULL,
[ProvinceName] [varchar](50) NULL
)