加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在asp.net中缓存sql server数据,直到修改行为止

发布时间:2020-12-16 06:59:53 所属栏目:asp.Net 来源:网络整理
导读:我经常以下列形式运行查询: select * from SomeTable where id=12345 页面后一页可能正在运行相同的查询,因为用户需要该行的值.通常我会获取一次并缓存它,但用户可以随时更改行,而其他用户也同时在SomeTable中进行更改,因此我无法对整个表进行缓存.我还有一
我经常以下列形式运行查询:

select * from SomeTable where id=12345

页面后一页可能正在运行相同的查询,因为用户需要该行的值.通常我会获取一次并缓存它,但用户可以随时更改行,而其他用户也同时在SomeTable中进行更改,因此我无法对整个表进行缓存.我还有一个问题,即我们有一个用于Web服务器的集群,因此当缓存失效时,我无法在Web服务器上进行内部跟踪.

有没有办法检测到这一行发生了变化? SqlDependecyCache类可以在这里帮助单个行到多个Web服务器吗?是否有一些可以通知我的Web应用程序的触发器或其他范例?

我想要两全其美 – 网络服务器上的实时缓存更新,但我不想运行任何查询以查看该行是否已更改,因为我可以轻松地再次获取该行.

解决方法

您需要的是启用SqlCacheDependency作为@RenusRusanu提到.

我有几个工作示例on my Github site,随意浏览
the code under my LearningProjects(第三方编辑)

> Caching SQL queries
> Page OutputCache declaratively
> Page OutputCache in code

您需要首先配置数据库才能使用SqlCacheDependency:

为了使用SQL依赖,我们需要在数据库中基本配置两件事:

>创建包含表和存储过程的数据库基础结构,为了配置它,我们使用aspnet_regsql.exe,如下所示:

/* For SQL Server authentication... */
aspnet_regsql.exe -S server -U user -P password -d database -ed
/* For Windows Authentication... */
aspnet_regsql.exe -S server -E -d database -ed

>创建轮询信息,其中包括指定要监视的表以及该表的触发器以填充所需的基础结构表

/* For SQL Server authentication... */
        aspnet_regsql.exe -S server
       -U user -P password -d database -t tableName -et
        /* For Windows Authentication... */
       aspnet_regsql.exe -S server
       -E -d database -t tableName -et

代码配置

var s = new SqlCacheDependency("AdventureWorks","Product");

        HttpContext.Current.Cache.Insert(
            "products",h,s,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration);

AdventureWorks名称是web.config文件中配置的sql依赖项的名称

<caching>
  <sqlCacheDependency enabled="true" pollTime="30000" >
    <databases>
      <add 
           name="AdventureWorks"
           connectionStringName="AdventureWorksPolling" />
    </databases>
  </sqlCacheDependency>
</caching>

pollTime可以在< add ...元素中配置,并将覆盖全局polltime 或者,您可以依赖SqlDataSource控件 为了在使用此控件时启用缓存,您需要将DataSourceMode属性设置为DataSet.在这种情况下,您不需要像之前解释的那样配置数据库 I just uploaded this example (full working example)

ASPX

<asp:SqlDataSource runat="server" ID="sds"
        ConnectionString="<%$ConnectionStrings:pubsConnectionString %>"
        CacheDuration="30"
        EnableCaching="true"
        SelectCommand="select * from jobs"
        DataSourceMode="DataSet"
        OnSelecting="sds_Selecting">

    </asp:SqlDataSource>
    <div>
        <asp:Literal runat="server" ID="msg" Mode="Encode"></asp:Literal>
    </div>
    <asp:GridView runat="server" DataSourceID="sds"></asp:GridView>

编辑1

为了在使用SqlCacheDependency时有选择地触发触发器,您需要更新手动生成的触发器.

使用aspnet_regsql -t -et …命令配置表时,会将触发器添加到指定的表中.此触发器负责填充SqlCacheDependency对象使用的AspNet_SqlCacheTablesForChangeNotification表,以从数据库中轮询数据.

触发器看起来像:

ALTER TRIGGER [dbo].[jobs_AspNet_SqlCacheNotification_Trigger] ON [dbo].[jobs]
                   FOR INSERT,UPDATE,DELETE AS BEGIN
                   SET NOCOUNT ON
                   EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'jobs'
                   END

您可以更新触发器,以便在您感兴趣的行更新时调用dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedureN’jobs的存储过程

我不是SQL专家,但我认为很容易找到一种干净的方法来检测已经改变的行,例如,谷歌搜索我刚发现这个链接

Most efficient method to detect column change in MS SQL Server

(编辑:李大同)

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

    推荐文章
      热点阅读