asp.net中SqlCacheDependency缓存技术概述

yizhihongxing

下面是详细讲解“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日

相关文章

  • C# 获取 PC 序列号的方法示例

    下面是详细讲解 “C#获取PC序列号的方法示例” 的完整攻略。 1. 硬件信息获取 获取PC序列号通常需要用到硬件信息,我们可以通过Windows的WMI技术获取各种硬件信息。以下是获取PC序列号的步骤: 在Visual Studio中新建一个C#控制台应用程序,命名为”GetPCSerialNumber”。 右键点击项目,选择”添加”->”引用……

    C# 2023年6月7日
    00
  • 解读ASP.NET 5 & MVC6系列教程(14):View Component

    下面我来为你详细讲解 ASP.NET 5 & MVC6 系列教程中的第 14 篇文章——View Component 的完整攻略。 一、View Component 简介 View Component 是在 ASP.NET Core 中新增加的基于 HTTP 特性的 MVC 元素。它的主要功能是可以自定义组件部件并将其添加到页面中。与使用Partia…

    C# 2023年5月31日
    00
  • DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    问题描述: 在IIS7上配置使用DirectoryEntry连接LDAP时,可能会遇到ADSIError错误,具体表现为:”DirectoryEntry Configuration IIS7 ADSIError:未知错误(0x80005000)”。 解决方案: 确定LDAP连接使用的用户名和密码是否正确。使用错误的用户名或密码会导致连接失败。 确定连接字符串…

    C# 2023年5月15日
    00
  • 详解c#索引(Index)和范围(Range)

    详解 C# 索引(Index)和范围(Range) 简介 C# 8.0 引入了一个新的功能,即索引和范围。 索引允许您通过使用[]操作符来访问元素的位置,而不是使用集合实例的元素本身。 而范围允许我们轻松地指定一个集合的范围,以便我们可以在此范围内迭代集合元素。如果您的工作与集合打交道,这些是您需要掌握的基本技能。 索引 索引是用于访问特定元素的整数。 索引…

    C# 2023年5月15日
    00
  • SQL Server 2008 安装SQLDMO.dll的方法

    首先需要明确的是,SQLDMO.dll是SQL Server的一个重要组件,许多应用程序需要它来连接和操作SQL Server数据库。在安装SQL Server 2008时,SQLDMO.dll并不是自动安装的,因此在使用一些依赖SQLDMO.dll组件的应用程序时,需要手动安装SQLDMO.dll。 下面是基本步骤: 1. 下载SQLDMO.dll文件 可…

    C# 2023年5月31日
    00
  • C#线程定义和使用方法详解

    C#线程定义和使用方法详解 在C#编程中,线程常常被用于多任务处理、后台计算等操作,本文将详细介绍C#的线程定义和使用方法。 线程定义 线程是进程中独立运行的一个执行流,由操作系统负责调度和执行。C#提供了Thread类来封装线程相关的操作。线程定义的一般语法如下: Thread thread = new Thread(new ThreadStart(Run…

    C# 2023年6月6日
    00
  • C#实现简单获取及设置Session类

    下面就是有关“C#实现简单获取及设置Session类”的详细攻略。 1. Session类的简介 ASP.NET Session对象是服务器端用来保存当前用户会话所需要的信息的一个对象,它的使用可以让我们在多个页面中共享数据,并且在不同的请求之间保持数据的一致性。Session类的主要作用有两个:一是用来存储用户端与服务器端会话信息,二是用来跟踪用户在整个网…

    C# 2023年6月6日
    00
  • asp.net实现的MD5加密和DES加解密算法类完整示例

    ASP.NET是微软开发的一个Web应用框架,可以使用C#或VB.NET等语言进行编写,同时它也提供了强密度加密算法,比如MD5和DES算法,用于对数据进行加密和解密。下面我来为您详细讲解“ASP.NET实现的MD5加密和DES加解密算法类完整示例”的攻略。 实现MD5加密算法类的示例 下面为您演示实现MD5加密算法类的完整示例代码: using Syste…

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