博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起谈.NET技术,ASP.NET缓存全解析6:数据库缓存依赖
阅读量:5730 次
发布时间:2019-06-18

本文共 4743 字,大约阅读时间需要 15 分钟。

  ASP.NET缓存全解析文章索引

  更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。 

  答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。 

  实现步骤: 

  下面就让我们看一下如何实现数据库缓存依赖功能:

  第一步: 修改web.config,让项目启用SqlCacheDependency

  将下列代码加入web.config<system.web>节:    

 
<?
xml version="1.0"
?>
<
configuration
>
<
appSettings
/>
<
connectionStrings
>
<
add
name
="strcodematic"
connectionString
="data source=127.0.0.1;initial catalog=codematic;user id=sa;password="
providerName
="System.Data.SqlClient"
/>
</
connectionStrings
>
<
system.web
>
<
caching
>
<
sqlCacheDependency
enabled
="true"
pollTime
="6000"
>
<
databases
>
 
<
add
name
="codematic"
connectionStringName
="strcodematic"
/>
</
databases
>
</
sqlCacheDependency
>
</
caching
>
<
compilation
debug
="true"
>
</
compilation
>
<
authentication
mode
="Windows"
/>
</
system.web
>
</
configuration
>
  这里的
connectionStringName指定了在
<connectionStrings>中添加的某一个连接字符串。
name则是为该
SqlCacheDependency起的名字,这个名字将在第
3步中用到。
  SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

  注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic"/>中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("codematic","P_Product"); 中的第一个参数(数据库名称)相一致。

  第二步:执行下述命令,为 数据库启用缓存依赖。

  如果要配置SqlCacheDependency,则需要以命令行的方式执行。

  aspnet_regsql.exe工具位于Windows\\Microsoft.NET\\Framework\\[版本]文件夹中。

  aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

  参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

  参数-t后面的字符串是数据表的名字。

  运行结果如图15-3所示:

15-3  启用数据库缓存依赖

  命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。

  注意:

  要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

  有两种方法配置SQLServer

  一使用aspnet_regsql命令行工具,

  二使用SqlCacheDependencyAdmin类。

  例如:

  aspnet_regsql -S "server"-E -d "database"–ed  或者

  aspnet_regsql -S "server"-E -d "database"-et -t "table"

  如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

  以下是该工具的命令参数说明:

  -? 显示该工具的帮助功能;

  -S 后接的参数为数据库服务器的名称或者IP地址;

  -U 后接的参数为数据库的登陆用户名;

  -P 后接的参数为数据库的登陆密码;

  -E 使用当前登录用户的 Windows 集成认证进行身份验证。

  -d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

  -C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

  -t 后接参数为对哪一个表采用SqlCacheDependency功能;

  -ed 允许对数据库使用SqlCacheDependency功能;

  -dd 禁止对数据库采用SqlCacheDependency功能;

  -et 允许对数据表采用SqlCacheDependency功能;

  -dt 禁止对数据表采用SqlCacheDependency功能;

  -lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。

  第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

 
///
<summary>
///
获取当前应用程序指定CacheKey的Cache对象值
///
</summary>
///
<param name="CacheKey">
索引键值
</param>
///
<returns>
返回缓存对象
</returns>
public
static
object
GetCache(
string
CacheKey)
{
System.Web.Caching.Cache objCache
=
HttpRuntime.Cache;
return
objCache[CacheKey];
}
///
<summary>
///
设置以缓存依赖的方式缓存数据
///
</summary>
///
<param name="CacheKey">
索引键值
</param>
///
<param name="objObject">
缓存对象
</param>
///
<param name="cacheDepen">
依赖对象
</param>
public
static
void
SetCache(
string
CacheKey,
object
objObject, System.Web.Caching.CacheDependency dep)
{
System.Web.Caching.Cache objCache
=
HttpRuntime.Cache;
objCache.Insert(
CacheKey,
objObject,
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration,
//
从不过期
System.Web.Caching.Cache.NoSlidingExpiration,
//
禁用可调过期
System.Web.Caching.CacheItemPriority.Default,
null
);
}
protected
void
Page_Load(
object
sender, EventArgs e)
{
string
CacheKey
=
"
cachetest
"
;
object
objModel
=
GetCache(CacheKey);
//
从缓存中获取
if
(objModel
==
null
)
//
缓存里没有
{
objModel
=
GetData();
//
把当前时间进行缓存
if
(objModel
!=
null
)
{
//
依赖数据库codematic中的P_Product表变化 来更新缓存
System.Web.Caching.SqlCacheDependency dep
=
new
System.Web.Caching.SqlCacheDependency(
"
codematic
"
,
"
P_Product
"
);
SetCache(CacheKey, objModel, dep);
//
写入缓存
}
}
GridView1.DataSource
=
(DataSet)objModel;
GridView1.DataBind();
}
//
查询数据
private
DataSet GetData()
{
string
conString
=
"
data source=127.0.0.1;initial catalog=codematic;user id=sa;password=
"
;
string
strSQL
=
"
SELECT * FROM P_Product
"
;
SqlConnection myConnection
=
new
SqlConnection(conString);
DataSet ds
=
new
DataSet();
myConnection.Open();
SqlDataAdapter adapter
=
new
SqlDataAdapter(strSQL, myConnection);
adapter.Fill(ds,
"
Product
"
);
myConnection.Close();
return
ds;
}

  从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency

  其中,创建SqlCacheDependency的构造方法:

  public SqlCacheDependency(string databaseEntryName,string tableName)

  databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency databases 元素中定义的数据库的名称。

  tableName :与 SqlCacheDependency 关联的数据库表的名称。

  这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158671.html

你可能感兴趣的文章
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
替代Windows Cmd的利器PowerCmd
查看>>
Struts2 学习小结
查看>>
Linux IPMI 安装配置实用
查看>>
烂泥:wordpress迁移到docker
查看>>
.扒渣机的性能及优势 
查看>>
Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
查看>>
RSA 生成公钥、私钥对
查看>>
C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
查看>>
测试工具综合
查看>>
asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
查看>>
分享一段ios数据库代码,包括对表的创建、升级、增删查改
查看>>