加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之五十九:使用SQL缓存依赖项SqlCacheDe

发布时间:2016-11-24 04:41:53 所属栏目:MsSql教程 来源:站长网
导读:导言: 在56和57章探讨的缓存技术使用的是基于时间的缓存周期,当过了某段时间后便将缓存数据从内存清除。当设置缓存时间为x秒时,数据在x秒内都是“新”的。当然,就像在60章谈到的那样,对静态数据来说,x可延伸到web应用程序的整个生命周期(lifetime)。

  我们来进行测试。在名为ProductsDeclarative的GridView控件下再添加一个GridView,设置其ID为ProductsProgrammatic,在其智能标里将其绑定到一个名为ProductsDataSourceProgrammatic的新的ObjectDataSource,设置该ObjectDataSource使用ProductsCL类,分别在SELECT 和 UPDATE标签里选GetProducts 和 UpdateProduct方法。

/uploads/allimg/c161121/14OI949241550-1W545.gif
图11:设置新ObjectDataSource使用ProductsCL类

/uploads/allimg/c161121/14OI9492D120-194958.gif
图12:在SELECT标签里选GetProducts方法

/uploads/allimg/c161121/14OI949295C0-205191.gif
图13:在UPDATE标签选UpdateProduct方法

  完成设置后,Visual Studio会自动地为GridView控件添加BoundFields和 CheckBoxFields。就像上面那个GridView控件一样,将ProductName, CategoryName, 和 UnitPrice以外的列都删除掉。在其智能标签里,启用分页、排序、编辑功能。同时,为使GridView控件的编辑功能正常工作,将OldValuesParameterFormatString属性改成默认值{0}. 或干脆在代码声明里将该属性删除。

完成上述修改后,最终的GridView 和 ObjectDataSource的声明代码看起来应该和下面的差不多:

<asp:GridView ID="ProductsProgrammatic" runat="server"
 AutoGenerateColumns="False" DataKeyNames="ProductID"
 DataSourceID="ProductsDataSourceProgrammatic" AllowPaging="True"
 AllowSorting="True">
 <Columns>
 <asp:CommandField ShowEditButton="True" />
 <asp:TemplateField HeaderText="Product" SortExpression="ProductName">
  <EditItemTemplate>
  <asp:TextBox ID="ProductName" runat="server"
   Text='<%# Bind("ProductName") %>' />
  <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
   ControlToValidate="ProductName" Display="Dynamic"
   ErrorMessage="You must provide a name for the product."
   SetFocusOnError="True"
   runat="server">*</asp:RequiredFieldValidator>
  </EditItemTemplate>
  <ItemTemplate>
  <asp:Label ID="Label2" runat="server"
   Text='<%# Bind("ProductName") %>' />
  </ItemTemplate>
 </asp:TemplateField>
 <asp:BoundField DataField="CategoryName" HeaderText="Category"
  ReadOnly="True" SortExpression="CategoryName" />
 <asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
  <EditItemTemplate>
  $<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
   Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
  <asp:CompareValidator ID="CompareValidator1" runat="server"
   ControlToValidate="UnitPrice" Display="Dynamic"
   ErrorMessage="You must enter a valid currency value with
   no currency symbols. Also, the value must be greater than
   or equal to zero."
   Operator="GreaterThanEqual" SetFocusOnError="True"
   Type="Currency" ValueToCompare="0">*</asp:CompareValidator>
  </EditItemTemplate>
  <ItemStyle HorizontalAlign="Right" />
  <ItemTemplate>
  <asp:Label ID="Label1" runat="server"
   Text='<%# Bind("UnitPrice", "{0:c}") %>' />
  </ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="ProductsDataSourceProgrammatic" runat="server"
 OldValuesParameterFormatString="{0}" SelectMethod="GetProducts"
 TypeName="ProductsCL" UpdateMethod="UpdateProduct">
 <UpdateParameters>
 <asp:Parameter Name="productName" Type="String" />
 <asp:Parameter Name="unitPrice" Type="Decimal" />
 <asp:Parameter Name="productID" Type="Int32" />
 </UpdateParameters>
</asp:ObjectDataSource>

  要测试位于缓存层的SQL cache dependency,先在ProductCL类的AddCacheItem方法里设置断点(breakpoint),然后启动调试。当你首次登录SqlCacheDependencies.aspx页面时,应该可以发生断点,因为是第一次请求数据,且把数据添加到内存。然后,在GridView里跳转到下一页或对某个列排序,这将导致GridView控件查询所需的数据,数据应该还驻存在内存因为表Products没有改动过。如果一直无法在内存找到所需的数据,务必确保内存够大,然后再试一次。

  在GridView里多跳转几页,再另外打开一个浏览器窗口,导航到Basics.aspx页面(~/EditInsertDelete/Basics.aspx). 更新一条记录。再回到第一个浏览器窗口,再跳转页面或实施排序。

  此时,你会遇到下面2种情况之一:要么程序发生断点,提示你数据被清除了,原图是数据库发生了改动;要么程序没有发生断点,这意味着页面SqlCacheDependencies.aspx显示的是“过时”的数据。如果没有发生断点,很可能是当数据改变时没有触发polling服务(polling service).我们知道,polling服务每隔设定的pollTime那么多毫秒对Products表进行检查,看是否改动过。因此在源数据的更新和“过时”数据的清除之间有个延迟期。

  注意:延迟很可能是当我们在SqlCacheDependencies.aspx页面里的GridView里编辑产品信息时发生的。在教程《在分层架构中缓存数据》里,我们添加MasterCacheKeyArray cache dependency来确保数据从内存清除。但在前面我们修改AddCacheItem方法时将其替换掉了,因此ProductsCL类将继续显示“过时”的数据,直到检测系统发现Products发生过改动。我们将在第七步看如何重新引入MasterCacheKeyArray cache dependency.

第七步:对缓存条目附加多个Dependencies

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读