SQL数据缓存依赖
转载
1.检查当前数据库是否启动SQL Server Service Broker,检测方法:
SELECT is_broker_enabled FROM sys.databases WHERE name = '数据库名'
或者
Select DATABASEpRoPERTYEX('数据库名','IsBrokerEnabled')
-- (1 为已启用,0为未启用)
如果当前数据库没有启动SQL Server Service Broker,可以执行:
ALTER DATABASE 数据库名 SET ENABLE_BROKER
2.在SQL Server中实现数据缓存依赖,需要显式调用 SqlDependency.Start()方法来启动接收依赖项更改通知的侦听器。通常在global.asax文件的 Application_Start()方法中实现调用。
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
System.Data.SqlClient.SqlDependency.Start(string connectionString); //开启SQLServer数据缓存依赖
}
void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
System.Data.SqlClient.SqlDependency.Stop(string connectionString); //关闭SQLServer数据缓存依赖
}
从上面的代码段中我们可以看出start()方法中的一个参数是数据库连接字符串,我们要将其保存在配置文件web.config中。启用SqlCacheDependency
<connectionStrings>
<add connectionString="server=.;database=UserInfo;uid=sa;pwd=svse" name="connStr" providerName="System.Data.SqlClient"/>
</connectionStrings>
<caching>
<sqlCacheDependency pollTime="6000" enabled="true">
<databases>
<add connectionStringName="connStr" name="UserInfo"/> <!--connectionStringName的值必须与connectionStrings的值相同-->
</databases>
</sqlCacheDependency>
</caching>
3.在代码中使用缓存,并为其设置SqlCacheDependency依赖:
public void User_Bind()
{
DataSet ds;
string connstr=System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
if (Cache["userinfo"] == null)
{
SqlConnection conn = new SqlConnection(connstr);
SqlCommand cmd = new SqlCommand("select userName,Address from dbo.Tab_user", conn);
ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(ds);
//启动监听
SqlDependency.Start(connstr);
//启用更改通知
SqlCacheDependencyAdmin.EnableNotifications(connstr);
//连接到 SQL Server 数据库并为 UserInfo 更改通知准备数据库表 dbo.Tab_user
SqlCacheDependencyAdmin.EnableTableForNotifications(connstr, "dbo.Tab_user");
//制定缓存策略
SqlCacheDependency cdep = new SqlCacheDependency("UserInfo", "dbo.Tab_user");
//把查询到的数据放入缓存
Cache.Insert("UserInfo", ds, cdep);
}
else
{
ds = (DataSet)Cache["userinfo"];
}
this.gv_user.DataSource = ds;
this.gv_user.DataBind();
}