c#缓存-SqlCacheDependency类
数据库缓存依赖主要解决的是当数据库的内容发生改变时,如何及时通知缓存,并更新缓存中的数据的问题。本节就介绍如何使用SQL Server 2005和.NET 2.0实现数据库的缓存依赖。 16.4.1 功能说明 SqlCacheDependency类的使用需要结合SQL Server 2005数据库,目前还没有Oracle数据库的缓存依赖。 16.4.2 语法定义 SqlCacheDependency类的使用语法如下: public class SqlCacheDependency : IDisposable 其中继承了接口“IDisposable”,此接口主要用来定义释放分配的非托管资源的方法。继承此接口必须实现方法Dispose,用来实现资源的释放。 SqlCacheDependency类主要的构造函数如下: public SqlCacheDependency(string database,string table) 其中参数一代表要启用缓存的数据库,参数二表示缓存的表。在实际使用过程中,只需要指明缓存的数据库和表即可。 16.4.3 方法和属性 SqlCacheDependency类的方法和属性同CacheDependency类相同,主要有三个。 — HasChanged:判断数据库缓存依赖是否发生了变化。 — UtcLastModified:获取缓存依赖上次更改的时间。 — Dispose:释放缓存依赖所占用的资源。 这三个成员的使用方法同CacheDependency类的成员相似,本节不再赘述。 在下节要介绍的使用实例中,将不再使用代码的方式实现缓存依赖,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency参数实现数据库表的缓存。如果要使用编程的方式实现此功能,可参考CacheDependency类的实例。 16.4.4 使用SqlCacheDependency类的操作流程 要实现数据库缓存依赖,必须结合数据库的操作。在使用数据库缓存依赖前,必须进行5步操作。详细流程如图16-6所示。 只有具备了上述条件,才可以正常地使用数据库缓存依赖。下一节将结合这5步操作演示如何实现数据库的缓存依赖。
图16-6 使用数据库缓存依赖的流程 16.4.5 典型应用:获取数据库表最新数据的实例 本例要实现的功能是当数据库的内容发生变化时,保存在缓存中的数据项被更新。具体演示的步骤如下所述。 在数据库中创建数据库“testCache”。 在数据库“testCache”中添加表“CacheTable”,其信息如表16-3所示。 表16-3 CacheTable表的信息
为数据库启用缓存通知。打开“开始”|“所有程序”|“Microsoft Visual Studio 2005”|“Visual Studio Tools”|“Visual Studio 2005命名提示”菜单命令。 输入如下命令,其中“-ed”和“-et”分别代表启用缓存依赖数据库和启用缓存数据表。 打开VS2005,新建一个网站,命名为“SqlCacheDependency”。 按F5键运行程序,主要目的是生成一个默认的Web.Config文件。然后关闭运行的程序。 在Web.config中配置数据库连接字符串,代码如下: <connectionStrings> <add name="TestCacheConnectionString" connectionString="Data Source=CGJ-57F90 CCA64C\sqlexpress;Initial Catalog=testCache;Integrated Security=True" providerName= "System. Data.SqlClient"/> </connectionStrings>
图16-7 启用数据库缓存依赖成功的提示图 在“system.web”节点内,添加数据库缓存依赖的配置,详细代码如下所示。注意配置中的“connectionStringName”属性,要与前面创建的数据库连接字符串的名字相对应。 <caching> <sqlCacheDependency enabled = "true" pollTime = "1000" > <databases> <add name="testCache" connectionStringName="TestCacheConnectionString" pollTime = "1000" /> </databases> </sqlCacheDependency> </caching> 按Ctrl+S组合键保存配置文件的更改。 打开默认生成的Default.aspx页,在设计视图中添加一个GridView控件,用来显示从数据库获取的数据。再添加一个Literal控件,主要用来显示时间,通过时间判断显示的是否是缓存中的数据。 为GridView配置数据源。单击其任务列表,在“选择数据源”下拉框中,单击“新建数据源”命令,打开数据源的配置向导。 在打开的数据源类型窗口中,选择“数据库”,单击“确定”按钮,出现选择连接字符串窗口,通过下拉列表选择刚刚创建的“TestCacheConnectionString”连接串。 单击“下一步”按钮,出现“配置Select语句”对话框,在“列”列表框中选择“*”,表示选中所有列。 单击“下一步”按钮出现测试查询对话框,然后单击“完成”按钮。 按F7键切换到到代码视图,在“Page_Load”事件中添加如下代码(主要是显示当前的时间,用来判断是否是缓存数据): Literal1.Text = DateTime.Now.ToString(); 按Ctrl+S组合键保存当前页的设计,再按F5键运行程序。当刷新页面时,可以看到时间是不断变化的,这说明数据并没有来自缓存。 打开Default.aspx页,在源代码视图的“<@page ”行下面,添加如下所示代码。其中使用的参数“SqlDependency”,就是用来添加数据库缓存依赖的。 <%@ OutputCache Duration="3600" SqlDependency="testCache:CacheTable" VaryByParam="none" %> 注意:Duration参数是表示缓存的过期时间,单位是毫秒。 按F5键运行程序,此时再刷新页面,发现当前的时间已经不再变化,因为整个页的数据被缓存了起来。 此时修改数据库的内容,然后刷新运行着的页面,可以发现,数据跟着发生了变化。这就是数据库缓存依赖的体现。当数据库内容更新时,不管缓存的时间有没有到,缓存的内容都会被更新。 16.5 Session和Cache的区别 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application。其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息。Session则保存对话信息。Application则是保存在整个应用程序范围内的信息,相当于全局变量。通常使用最频繁的是Session,那么Session和Cache又有什么区别呢? 本节结合使用经验,详细介绍Session缓存和Cache缓存的区别。 (1)最大的区别是Cache提供缓存依赖来更新数据,而Session只能依靠定义的缓存时间来判断缓存数据是否有效。 (2)即使应用程序终止,只要Cache.Add方法中定义的缓存时间未过期,下次开启应用程序时,缓存的数据依然存在。而Session缓存只是存在于一次会话中,会话结束后,数据也就失效了。 (3)Session容易丢失,导致数据的不确定性,而Cache不会出现这种情况。 (4)由于Session是每次会话就被加载,所以不适宜存放大量信息,否则会导致服务器的性能降低。而Cache则主要用来保存大容量信息,如数据库中的多个表。 (5)VS2005的测试版提供了将缓存保存在硬盘上的参数,但正式版中取消了这个功能,估计其在以后版本中会重新实现。而Session目前只能保存在内存中,对其性能有影响。 为了提高Cache的有效利用率,建议对于不经常改动的数据使用Cache。 |