缓存的数据存储
- 2020年11月11日
- 6分钟阅读
XPO为数据存储级别的缓存提供功能。高速缓存存储查询及其在数据存储中执行时的结果。每当以前执行过的查询通过缓存时,该查询的结果将立即返回,而无需往返于数据存储。通常,这可以显着提高性能,并确保在分布式应用程序中通过有线传输尽可能少的数据。
为了使数据存储缓存,四个班级指定根及其节点- DataCacheRoot,MSSql2005SqlDependencyCacheRoot,DataCacheNode和DataCacheNodeLocal -必须结合起来。缓存的最低设置需要一个根(DataCacheRoot或MSSql2005SqlDependencyCacheRoot)和一个节点(DataCacheNode或DataCacheNodeLocal)。可以从单个Root和任意数量的Node(它们可以链接到Root或另一个Node)构建高速缓存层次结构。当应用程序的某些部分需要使用不同的设置进行数据访问(例如当前数据)时,这在客户端/服务器设置中是有意义的。
节点实际上缓存数据,而根存储有关表更新的信息并将其与节点同步。为了使表更新信息和缓存的数据保持同步,根节点和节点使用ICacheToCacheCommunicationCore通道相互通信。每次节点与它的父节点(一个根节点或另一个节点)联系时,表更新信息都会沿从根节点到节点的方向传递。节点及其父节点之间的这些常规联系需要使表信息保持最新。可以使用DataCacheNode.MaxCacheLatency指定这些联系人的延迟。领域。此字段定义在强制与父级联系之前允许经过的最长时间。因此,如果节点接收到查询,它将首先找到该查询的缓存结果集,并且如果自上次父级联系以来超过了DataCacheNode.MaxCacheLatency指定的时间,它将向其父级执行快速请求以同步表更新资料。
注意
数据存储缓存依赖于这样的想法,即缓存结构知道对数据所做的更改。因此,即使在多用户设置中,也应确保以允许缓存结构识别它们的方式执行所有查询和更新。为此,必须通过客户端节点(数据缓存节点实例)和服务器端根目录(或服务器端根节点链)路由所有客户端对数据的请求。如果出于任何原因在数据库中进行了更改而没有通过缓存结构,则可以使用以下实用程序方法。
- 该数据缓存基地。通知根或节点的脏表方法(对于MSSql2005Sql依赖项缓存根,请使用其MSSql2005Sql依赖项缓存根。通知脏表)-通知缓存有关特定表的更改。
- 节点的数据缓存节点。抓住截至方法-要缓存完全同步。
直接SQL查询和存储过程调用不会被缓存。要在调用后正确调整缓存,请使用上面列出的任何方法。如果您使用MS SQL Server(2005版和更高版本)数据库作为数据存储的后端,则可以使用Sql Dependency启用自动通知缓存层次结构有关表更新的信息(请参见下文)。
#使用Sql依赖
SqlDependency是一种MS SQL Server功能(在2005版和更高版本中找到),它允许数据库服务器向客户端通知数据库中发生的更改。您可以启用缓存层次结构以利用此功能,以自动通知对缓存数据库所做的任何更改(即使它们是在缓存层次结构之外进行的)。为此,请执行以下任一操作。
-
将MSSql2005SqlDependencyCacheRoot用作缓存层次结构中的Root元素。若要创建Root元素,请调用MSSql2005SqlDependencyCacheRoot.CreateSqlDependencyCacheRoot重载方法。
-
使用MSSql2005SqlDependencyCacheRoot.CreateProviderFromString_CacheRoot或MSSql2005SqlDependencyCacheRoot.CreateProviderFromString_WithCache方法创建缓存的数据存储提供程序。这些方法自动创建一个MSSql2005SqlDependencyCacheRoot实例,并将其与此提供程序关联。
-
基于MSSqlConnectionProvider.GetConnectionString2005CacheRoot或MSSqlConnectionProvider.GetConnectionString2005WithCache方法返回的连接字符串创建缓存的数据存储提供程序。创建缓存的数据存储提供程序时,将自动创建一个MSSql2005SqlDependencyCacheRoot实例并将其与此提供程序关联。
string connectionString = "data source=.;initial catalog=DBName;integrated security=sspi";
IDisposable[] disposeOnDisconnect;
IDataStore node = MSSql2005SqlDependencyCacheRoot.CreateProviderFromString_WithCache(
connectionString, AutoCreateOption.DatabaseAndSchema, out disposeOnDisconnect);
XPDictionary dict = new ReflectionDictionary();
dict.GetDataStoreSchema(typeof(Customer).Assembly);
XpoDefault.DataLayer = new ThreadSafeDataLayer(dict, node);
SqlDependency功能需要大量资源-每次在被监视的数据库表中发生更改时,必须通知订阅SqlDependency的每个客户端。因此,建议仅与一个数据库关联一个MSSql2005SqlDependencyCacheRoot,将更改通知发布到所有其他缓存层次结构节点。
若要了解使用SqlDependency功能的先决条件,请参阅使用查询通知MSDN时的特殊注意事项。
#缓存配置设置
使用缓存配置设置,可以通过指定要缓存的表来轻松配置节点的缓存范围。由于不需要缓存经常更改的表,因此可以使用配置设置将它们从缓存范围中排除。若要指定设置,请使用Root的DataCacheBase.Configure方法。对于MSSql2005SqlDependencyCacheRoot,请使用相应的MSSql2005SqlDependencyCacheRoot.CreateSqlDependencyCacheRoot重载方法。
#连接到分布式应用程序中的缓存数据存储
您可以在分布式应用程序中发布缓存的数据存储(ICachedDataStore实现器)。当您的客户端应用程序使用http:// host:port / servicename.svc或net.tcp:// host:port / servicename连接字符串格式连接到缓存的数据存储时,XPO会自动创建一个Node(DataCacheNode对象)。在客户端上。然后,您可以在客户端上创建任意数量的节点和节点链,并将它们链接到该节点以创建缓存层次结构。如果您在缓存的数据存储中利用SqlDependency功能,则在不需要大量资源的情况下,将通过数据库服务器上的更改通知受益于最终的分布式应用程序设置。
在服务方面,我们建议仅创建DataCacheRoot。通常,使用CachedDataStoreService类的服务应与数据库服务器发布在同一台计算机上或同一局域网中。在这种配置下,服务和数据库之间的流量不会显着影响性能,通常不需要缓存这些查询。但是,某些应用程序可能会执行许多带有聚合或分组的繁重查询,并且这些操作可能会在数据库侧花费大量时间。我们为这种情况提供了一个DataCacheNode后代-DataCacheNodeLocal。如果您的应用程序通过分组和聚合执行许多选择操作,请检查在服务应用程序中使用此类是否有利于性能。