asp.net中SqlCacheDependency缓存技术概述

下面是详细讲解“asp.net中SqlCacheDependency缓存技术概述”的完整攻略。

什么是SqlCacheDependency缓存技术

在ASP.NET中,我们通常使用缓存技术来提高网站的访问速度和性能。SqlCacheDependency缓存技术是ASP.NET提供的一种高级缓存技术。它通过监视SQL Server数据库的表或视图上所做的更改来自动使ASP.NET缓存无效,从而保持缓存的有效性和及时性。

如何使用SqlCacheDependency缓存技术

使用SqlCacheDependency缓存技术有以下几个步骤:

  1. 启用缓存依赖
    在Web.config文件中,需要添加以下行来启用缓存依赖:
<caching>
  <cache disableMemoryCollection="true" />
</caching>
<system.web>
  <caching>
    <sqlCacheDependency enabled="true" />
  </caching>
</system.web>

设置enabled属性为true,这将启用缓存依赖。

  1. 配置缓存依赖
    在Web.config文件中,需要配置SQL Server数据库连接字符串和缓存依赖项。例如:
<connectionStrings>
  <add name="ConnectionString" connectionString="Data Source=.\SQLExpress;Initial Catalog=MyDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
  <caching>
    <sqlCacheDependency enabled="true">
      <databases>
        <add name="MyDB" connectionStringName="ConnectionString" pollTime="10:00:00" />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

添加databases元素并设置name为所要监视的数据库名称,connectionStringName为连接字符串名称,pollTime为轮询数据库的时间间隔。

  1. 在ASP.NET中使用缓存依赖
    在ASP.NET代码中使用SqlCacheDependency缓存技术的方法和常规缓存技术一样。例如,使用缓存技术获取商品列表的代码:
public List<Product> GetProductList()
{
    string cacheKey = "productList";
    List<Product> products = (List<Product>)HttpContext.Current.Cache[cacheKey];
    if (products == null)
    {
        products = LoadProductListFromDatabase();
        HttpContext.Current.Cache.Insert(cacheKey, products, null, 
            DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration,
            CacheItemPriority.Default, OnProductListRemove);
    }
    return products;
}

在这里,我们使用HttpContext.Current.Cache对象来获取和设置缓存。当缓存依赖项更改时,需要调用OnProductListRemove方法来使缓存无效:

private void OnProductListRemove(string key, object value, CacheItemRemovedReason reason)
{
    if (reason == CacheItemRemovedReason.DependencyChanged)
    {
        SqlCacheDependencyAdmin.EnableNotifications("MyDB");
        SqlCacheDependencyAdmin.EnableTableForNotifications("MyDB", "Product");
    }
}

在这里,我们使用SqlCacheDependencyAdmin类来启用依赖项更改通知。EnableNotifications方法启用对指定数据库的通知,EnableTableForNotifications方法启用对指定表或视图的通知。

  1. 在SQL Server数据库中启用缓存依赖
    在SQL Server数据库中,需要启用缓存依赖并创建缓存依赖项。例如,要在Product表上启用缓存依赖项,可以执行以下SQL语句:
EXECUTE sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXECUTE sp_configure 'clr enabled', 1;
RECONFIGURE WITH OVERRIDE;
GO
CREATE ASSEMBLY [System.Web] FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll' WITH PERMISSION_SET = UNSAFE;  --这个路径可能因为操作系统和.net版本等原因会不同
GO
CREATE ASSEMBLY [SqlCacheDependencyImp] AUTHORIZATION [dbo]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SqlCacheDependency.dll';  --这个路径可能因为操作系统和.net版本等原因会不同
GO
CREATE TABLE [dbo].[Product](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Category] [nvarchar](50) NOT NULL,
    [Price] [decimal](18, 2) NOT NULL,
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
EXEC sys.sp_addapprole 'productrole', 'productpassword';
GO
CREATE PROCEDURE [dbo].[ProductInsert]
    @Name NVARCHAR(50),
    @Category NVARCHAR(50),
    @Price DECIMAL(18,2)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[Product] ([Name], [Category], [Price])
    VALUES (@Name, @Category, @Price);
END
GO
EXEC sp_addrolemember 'productrole', 'sa';
GRANT EXECUTE ON [dbo].[ProductInsert] TO [productrole];
GO
EXEC sp_changedbowner 'sa';
GO
EXEC sp_configure 'Database Mail XPs', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_addmessage 14660, 16, N'Product Inserted.', N'dbo';
GO
EXEC sp_addmessage 14661, 16, N'Another Product Inserted.', N'dbo';
GO
CREATE TRIGGER [ProductInsertTrigger] ON [dbo].[Product]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ProductId INT;
    SELECT @ProductId = [Id] FROM INSERTED;

    DECLARE @MessageBody NVARCHAR(200);
    SET @MessageBody = 'Product Inserted. Product ID: ' + CONVERT(NVARCHAR(20), @ProductId);
    EXEC msdb.dbo.sp_send_dbmail
        @recipients='your_email_address@example.com',
        @subject='Product Inserted.',
        @body=@MessageBody;

    RAISERROR (14660, 16, 1);
END
GO
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'clr enabled', 0;
RECONFIGURE WITH OVERRIDE;

在这里,我们创建了Product表并启用了缓存依赖项。当在Product表中插入一条新记录时,将自动通知ASP.NET缓存使缓存无效。

示例:启用SqlCacheDependency缓存技术

以下是示例代码,演示如何在Web应用程序中使用SqlCacheDependency缓存技术:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindData();
        StartSqlDependency();
    }
}

private void BindData()
{
    string cacheKey = "productList";
    List<Product> products = (List<Product>)HttpContext.Current.Cache[cacheKey];
    if (products == null)
    {
        products = LoadProductListFromDatabase();
        HttpContext.Current.Cache.Insert(cacheKey, products, null, 
            DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration,
            CacheItemPriority.Default, OnProductListRemove);
    }
    GridView1.DataSource = products;
    GridView1.DataBind();
}

private void OnProductListRemove(string key, object value, CacheItemRemovedReason reason)
{
    if (reason == CacheItemRemovedReason.DependencyChanged)
    {
        SqlCacheDependencyAdmin.EnableNotifications("MyDB");
        SqlCacheDependencyAdmin.EnableTableForNotifications("MyDB", "Product");
    }
}

private void StartSqlDependency()
{
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    using (SqlCommand command = new SqlCommand("SELECT [Id], [Name], [Category], [Price] FROM [dbo].[Product] ORDER BY [Id]", connection))
    {
        connection.Open();
        SqlCacheDependency dependency = new SqlCacheDependency(command);
        command.CommandType = CommandType.Text;
        command.Notification = null;
        command.CommandTimeout = 15;
        Cache.Insert("dependency", dependency, null, 
            Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, 
            CacheItemPriority.NotRemovable, OnDependencyRemove);
        command.ExecuteReader();
    }
}

private void OnDependencyRemove(string key, object value, CacheItemRemovedReason reason)
{
    if (reason == CacheItemRemovedReason.DependencyChanged)
    {
        BindData();
        StartSqlDependency();
    }
}

private List<Product> LoadProductListFromDatabase()
{
    List<Product> productList = new List<Product>();
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
    using (SqlCommand command = new SqlCommand("SELECT [Id], [Name], [Category], [Price] FROM [dbo].[Product] ORDER BY [Id]", connection))
    {
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                productList.Add(new Product {
                    Id = reader.GetInt32(0),
                    Name = reader.GetString(1),
                    Category = reader.GetString(2),
                    Price = reader.GetDecimal(3)
                });
            }
        }
    }
    return productList;
}

在这个示例中,我们使用SqlCacheDependency缓存技术来缓存Product列表。当在Product表中插入、更新或删除记录时,将自动通知ASP.NET缓存使缓存无效。

示例:在SQL Server中启用缓存依赖

以下是示例SQL脚本,演示如何在SQL Server中启用缓存依赖:

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE WITH OVERRIDE;
GO
CREATE ASSEMBLY [System.Web] FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll' WITH PERMISSION_SET = UNSAFE;
GO
CREATE ASSEMBLY [SqlCacheDependencyImp] AUTHORIZATION [dbo]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SqlCacheDependency.dll';
GO
CREATE TABLE [dbo].[Product](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Category] [nvarchar](50) NOT NULL,
    [Price] [decimal](18, 2) NOT NULL,
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
EXEC sys.sp_addapprole 'productrole', 'productpassword';
GO
CREATE PROCEDURE [dbo].[ProductInsert]
    @Name NVARCHAR(50),
    @Category NVARCHAR(50),
    @Price DECIMAL(18,2)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[Product] ([Name], [Category], [Price])
    VALUES (@Name, @Category, @Price);
END
GO
EXEC sp_addrolemember 'productrole', 'sa';
GRANT EXECUTE ON [dbo].[ProductInsert] TO [productrole];
GO
EXEC sp_changedbowner 'sa';
GO
EXEC sp_configure 'Database Mail XPs', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_addmessage 14660, 16, N'Product Inserted.', N'dbo';
GO
EXEC sp_addmessage 14661, 16, N'Another Product Inserted.', N'dbo';
GO
CREATE TRIGGER [ProductInsertTrigger] ON [dbo].[Product]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ProductId INT;
    SELECT @ProductId = [Id] FROM INSERTED;

    DECLARE @MessageBody NVARCHAR(200);
    SET @MessageBody = 'Product Inserted. Product ID: ' + CONVERT(NVARCHAR(20), @ProductId);
    EXEC msdb.dbo.sp_send_dbmail
        @recipients='your_email_address@example.com',
        @subject='Product Inserted.',
        @body=@MessageBody;

    RAISERROR (14660, 16, 1);
END
GO
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'clr enabled', 0;
RECONFIGURE WITH OVERRIDE;

在这个示例中,我们创建了Product表并启用了缓存依赖项。当在Product表中插入一条新记录时,将自动通知ASP.NET缓存使缓存无效。同时,我们还添加了一个触发器,当有新的Product记录插入时,将发送电子邮件通知。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net中SqlCacheDependency缓存技术概述 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • .NET Core部署为Windows服务的详细步骤

    以下是.NET Core部署为Windows服务的详细步骤: 1. 什么是Windows服务 Windows服务是一种在后台运行的,它可以在Windows操作系统启动时自动启动,并在系统运行时一直运行。Windows服务通常用于执行后台任务,例如监视文件夹、处理消息队列等。 2. 什么是.NET Core .NET Core是微软的一个跨平台开发框架,它支持…

    C# 2023年5月12日
    00
  • .NET MVC中ViewData,ViewBag和TempData的区别浅析

    视图数据传递的作用 在MVC框架的开发中,视图所需要的数据可以通过视图中的一个变量或对象来接收,因此需要将需要传递的数据先存储到某一个传递的变量中,在视图中再进行读取和使用。而ViewData、ViewBag和TempData这三个可选项都可以用来传递这些数据。 ViewData是一个字典类型的对象,可以用于在控制器和视图之间传递数据,所传递的数据只在请求期…

    C# 2023年5月31日
    00
  • Delphi中使用ISuperObject解析Json数据的实现代码

    让我来详细讲解一下“Delphi中使用ISuperObject解析Json数据的实现代码”的完整攻略吧。 什么是ISuperObject 在介绍如何使用ISuperObject解析Json数据之前,我们先来了解一下ISuperObject是什么。ISuperObject是Delphi语言中一款轻量级的Json解析工具,它不仅易于使用,而且解析速度非常快,目前…

    C# 2023年5月31日
    00
  • C#中var关键字用法分析

    C#中var关键字用法分析 在C#中,var关键字可用于声明一个隐式类型的变量,这种类型是在编译器编译时推断出来的。在这篇文章中,我们将详细讲解var关键字的用法,并给出示例说明。 var的用法 1. 声明变量 使用var来声明一个变量时,编译器会自动将该变量的类型推断为其初始化表达式的类型。 var name = "Tom"; var …

    C# 2023年6月1日
    00
  • cryptohack wp day(1)

    就从头开始吧 第一题 (ASCII) 一道简单的ASCII码转换,直接用题目的提示代码解就行了 ascii=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125] flag=”” for i in asci…

    C# 2023年5月8日
    00
  • C# String.Substring()方法: 检索此字符串中子字符串的指定部分

    String.Substring() 可以用于获取字符串的子串,它的作用是返回一个新的字符串,该字符串是原字符串的一个子集。 使用方法 String.Substring()的使用方法如下: string.Substring(int startIndex) string.Substring(int startIndex, int length) 其中,star…

    C# 2023年4月19日
    00
  • C# 使用 WebBrowser 实现 HTML 转图片功能的示例代码

    针对这个问题,我为您提供以下完整攻略: 功能介绍 本篇文章主要介绍如何使用C#中的WebBrowser控件实现将HTML转换为图片的功能。通过对WebBrowser控件进行截图,从而实现将HTML文件内容转换成图片。 实现步骤 1. 创建Windows Form应用程序 首先需要创建一个Windows Form应用程序,在窗体中添加一个按钮和一个WebBro…

    C# 2023年6月6日
    00
  • C#调用Python程序传参数获得返回值

    下面是详细的讲解: 1. 安装Python环境和C#运行库 首先,需要在电脑上安装Python环境和C#运行库,以便在C#中调用Python程序。Python环境需下载安装Python3版本及以上。C#运行库需要使用NuGet安装Python.Runtime包。可以通过在项目中右击“依赖项”-> “管理NuGet程序包” -> 搜索“python…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部