分布式缓存已成为任何高事务应用程序的一个非常重要的部分,以确保数据库不会成为可扩展性瓶颈。 但是,由于分布式缓存会保留应用程序数据的副本,因此您必须始终确保它与数据库保持同步。 没有这个,分布式缓存就会有导致数据完整性问题的旧数据。 SQL Server 提供了一种事件通知机制,其中 分布式缓存 喜欢 NCache 可以通过以下方式注册自己以获取更改通知 SqlCacheDependency 然后在数据库中的基础数据更改时接收来自 SQL Server 的通知。 这允许 NCache 立即使相应的缓存项无效或重新加载,这使缓存始终与数据库同步。 然而, SqlCacheDependency 可以成为将缓存与数据库同步的一种非常耗费资源的方式。 首先,你必须创建一个单独的 SqlCacheDependency 对于每个缓存的项目,这很容易达到数万甚至数十万。 而且,SQL Server 使用数据结构来分别维护每个 SqlCachDependency,以便它可以监视与之相关的任何数据更改。 而且,这会消耗大量额外资源,并且很容易阻塞数据库服务器。
其次,SQL Server 会为每个数据更改触发单独的 .NET 事件,并且 NCache 捕获这些事件。 而且,这些 .NET 事件可能非常繁重,很容易使网络流量和整体性能不堪重负 NCache 和你的申请。 有一个更好的选择。 这涉及到你写一个 CLR 存储过程 与 NCache 从 SQL Server 中直接更新或使相应的缓存项无效。 然后,您可以从表的更新或删除触发器中调用此 CLR 存储过程。 您可以使用 SQL Server 2005 或 2008 以及 Oracle 10g 或更高版本执行此操作,但前提是它在 Windows 上运行。 CLR 存储过程的资源效率更高,因为它不创建与 SqlCacheDependency. 而且,它也不会触发 .NET 事件 NCache. 相反,它打开了一个 NCache 客户端连接并直接告诉 NCache 是否使缓存项无效或重新加载。 而且,这种联系与 NCache 高度优化,比 .NET 事件更快更轻。
下面是一个如何使用 CLR 存储过程的示例。
- 复制 log4net 和 protobuf网 从 Windows GAC 到 NCache/bin/assembly/2.0 文件夹(如果目标平台是 .NET 4.0,则选择 4.0)。
2. 注册 NCache 以及 SQL Server 中的以下程序集。 下面给出示例。 在此示例中,我们使用 Northwind 作为示例数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
use Northwind alter database Northwind set trustworthy on; go drop assembly SMdiagnostics drop assembly [System.Web] drop assembly [System.Messaging] drop assembly [System.ServiceModel] drop assembly [System.Management] CREATE ASSEMBLY SMdiagnostics AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv3.0Windows Communication FoundationSMdiagnostics.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Web] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.Web.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Management] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFramework64v2.0.50727System.management.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.Messaging] AUTHORIZATION dbo FROM N'C:WindowsMicrosoft.NETFrameworkv2.0.50727System.Messaging.dll' WITH permission_set = unsafe CREATE ASSEMBLY [System.ServiceModel] AUTHORIZATION dbo FROM N'C:Program Files (x86)Reference AssembliesMicrosoftFrameworkv3.0System.ServiceModel.dll' WITH permission_set = unsafe CREATE ASSEMBLY NCache FROM N'C:Program FilesNCachebinassembly2.0Alachisoft.NCache.Web.dll' WITH permission_set = unsafe |
3. 打开 Visual Studio 编写存储过程 NCache 并创建一个 SQL CLR 数据库项目,如下所述。 添加引用 NCache 您在上一步中创建的程序集。 您需要参考的程序集在上面突出显示。 它将出现在 SQL Server 下,同名“NCache“。
4. 编写你的存储过程。 这是给出的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void TestSProc(string cacheName) { //--- Put your code here SqlPipe sp = SqlContext.Pipe; try { sp.Send("Starting ....."); if (string.IsNullOrEmpty(cacheName)) cacheName = "mycache"; Cache _cache = NCache.InitializeCache(cacheName); _cache.Insert("key", DateTime.Now.ToString()); sp.Send("Test is completed ..."); } |
5. 在数据库上启用 CLR 集成,如下所示:
1 2 3 4 5 |
sp_configure 'clr enabled', 1 GO RECONFIGURE GO |
6. 从 Visual Studio 部署存储过程并进行测试。
7.部署存储过程后,需要将你的存储过程程序集放在(C:Program FilesNCachebinassembly2.0) 文件夹,因为它不直接从 Windows GAC 文件夹解析程序集引用,并且在本地需要它们。
基于 CLR 的存储过程或触发器可以大大提高应用程序的性能。 SqlCacheDependency 这相对较慢,并且对于大型数据集来说可能是压倒性的。
SQLCacheDependency 本身没有问题。 如果您的应用程序将更改提交到数据库,那么最佳实践是在两者之间添加一个分布式缓存来处理依赖关系并因此提交到数据库。 只有在两种情况下,您才会寻找替代解决方案。
一种是其他应用程序正在对数据库进行更改,而您对其没有任何控制权,或者您无法指示它使用缓存进行数据库提交。
第二个原因可能是当您希望对每个表有许多依赖关系或者您有一个高数据库写入/更新环境时,您可以使用轮询依赖关系。 它将轮询数据库以检测缓存中的任何更改和无效项目。
有关更多信息,请参阅此文档: https://www.alachisoft.com/resources/docs/ncache/help/polling-based-dependency.html
你好伊克巴尔,
我正在尝试关注这篇文章,但是在运行 SQL 脚本时出现以下错误。
消息6544,级别16,状态1,行26
为程序集“System.ServiceModel”创建程序集失败,因为程序集“microsoft.visualbasic.activities.compiler”格式错误或不是纯 .NET 程序集。
如果不再支持从 SQLCLR 过程内部使用 WCF,那么推荐的缓存同步方法是什么,同时避免了性能问题 SqlCacheDependency.
谢谢,瑞安
该帖子已更新。 现在所有步骤都可以使用 NCache 4.1
谢谢谢谢,
请下载将在您的环境中解决此问题的修复程序。 这个实现是在上面提供的 NCache 4.1 版本,只有在应用以下修复后才会兼容。
https://www.alachisoft.com/downloads/support/NCache4.1_.NET_CLR_SPROC_Fix.zip
请参阅补丁中的“Readme.txt”文件以将其应用到您的环境中。
目前,此修复程序是为缓存服务器安装提供的,并且仅包含 .Net 2.0 程序集,您可以在您的环境中测试和验证这一点,我们可以为您提供特定于 .NET 的完整补丁和 NCache 按需安装。
此外,您需要确保在部署存储过程之后,您需要将存储过程程序集放在(C:Program FilesNCachebinassembly2.0) 文件夹,因为它不直接从 Windows GAC 文件夹解析程序集引用,并且在本地需要它们。
请告诉我进展如何
你好伊克巴尔,
我使用与第 5 段中相同的代码创建了您所描述的 CLR 存储过程。当我尝试执行时,它会引发以下异常:
Alachisoft.NCache.Runtime.Exceptions.ConfigurationException:读取client.ncconf时出错。
似乎 NCache 找不到配置文件,但该文件存在于安装目录 C:Program FilesNCache配置
请大家帮忙。
谢谢
谢尔盖·