如何:在使用缓存时提高 Business Connectivity Services 解决方案性能

上次修改时间: 2010年6月30日

适用范围: SharePoint Server 2010

本文内容
使用版本字段以最小化外部数据源往返
仅在确实需要关联时启用关联
如果需要相关数据,请考虑使用两个订阅而不是一个订阅
通过使用订阅中的显式标识来指定要同步的项
指定筛选器以减少客户端应用程序所下载的数据量
示例

在设计将使用缓存的 Business Connectivity Services 解决方案时,可记住以下最佳做法以充分使用缓存并确保应用程序实现最佳性能:

  • 使用版本字段(若可用)以最大程度地减少与外部应用程序的往返。

  • 仅在应用程序需要时启用关联,并确保最终用户不会错误地启用关联。

  • 如果需要相关数据,请考虑使用两个订阅,而不是使用带订阅关联的订阅。

  • 通过使用订阅中的显式标识来指定要同步的项。

  • 指定筛选器以减少客户端应用程序所下载的数据量。

下面我们将详细了解上述所有最佳做法。

使用版本字段以最小化外部数据源往返

通过使用外部数据源中的版本字段,可以最大程度地减少对外部数据源的调用。版本字段可以是递增数字字段或 LastModified 时间戳,前者表示实体实例的版本,后者指定实体实例上一次在外部数据源中更新的时间。如果提供了一个此类字段,则该字段应是模型中 Finder 和 SpecificFinder 方法的返回参数的一部分。如果提供了一个版本字段,则同步过程会从外部应用程序获取 ID 和版本,并仅在版本与缓存中的版本不同时发出 SpecificFinder 调用。

仅在确实需要关联时启用关联

如果订阅包含已启用的关联,则同步过程会在缓存中填入相关的实体实例。为此,它为该订阅进行与缓存中的实体实例一样多的 Associate 方法实例调用。这将返回相关实体实例的 ID。然后,对每个返回的 ID 调用 SpecificFinder 以获取其他字段。因此,当缓存中产生大量开销并可能严重影响应用程序性能时,只应在确实需要关联时启用关联。

如果需要相关数据,请考虑使用两个订阅而不是一个订阅

如上面的主题中所述,关联会在缓冲中增加大量开销并可能严重影响应用程序性能。如果需要应用程序中的相关数据,则应考虑创建两个订阅(一个面向客户的订阅和一个面向订单的订阅)而不是使用订阅关联。这将减少对外部应用程序的调用次数,并增加应用程序吞吐量。

通过使用订阅中的显式标识来指定要同步的项

如果您完全知道要同步的项,则可以将其标识分别添加到订阅。以编程方式执行此操作会容易得多,因为您必须将序列化的标识置于订阅 XML 文件中。

为了获取序列化的标识,您实例化一个带适当的标识符值的 Identity 对象,并调用其 Serialize 方法。有关详细信息,请参阅 Identity.Serialize() 的文档。

在拥有标识的序列化字符串后,将该字符串添加到 <Identities> 标记内的 <Identity> 标记中,如本主题后面的示例中所示(请参阅示例。)

指定筛选器以减少客户端应用程序所下载的数据量

优化同步的常见方法是减少客户端所下载的数据量,而执行此操作的最简单方法是使用筛选器。可用于减少下载项数目的同步框架所支持的筛选器为 Wildcard、Comparison 和 Limit 筛选器。例如,可以使用 Wildcard 筛选器,通过将"M*"用作筛选值来下载其姓名以字母"M"开头的所有员工。或者,可以使用比较筛选器选择其邮政编码为"98052"的所有客户。可使用 Limit 筛选器将产品数目限制为 100。

示例

以下示例包含一个订阅(其显式标识在 11003 和 11020 之上)和一个筛选器(只返回 CustumerID 大于 11050 的客户)。

<?xml version="1.0" encoding="utf-8"?> 
<Subscription LobSystemInstanceName="AdventureWorksContosoLOBInstance" 
    EntityNamespace="AdventureWorksContoso" EntityName="Customer" 
    Name="AdventureWorksContosoCustomerSubscription" View="GetCustomerById" 
    IsCached="true" RefreshIntervalInMinutes="360" 
    xmlns="https://schemas.microsoft.com/office/2006/03/BusinessDataCatalog"> 
  <Identities> 
    <Identity>i+yoAAA==</Identity> 
    <Identity>iDCsAAA==</Identity> 
  </Identities> 
  <Queries> 
    <Query Name="AdventureWorksContosoCustomerQuery" 
        MethodInstanceName="GetCustomers" 
        DefaultDisplayName="Customer Read List" 
        RefreshIntervalInMinutes="180" IsCached="true" Enabled="true"> 
      <FilterValues> 
        <FilterValue FilterDescriptorName="MinCustomerId" FilterIndex="0" 
            Type="System.Int32">11050</FilterValue> 
      </FilterValues> 
    </Query> 
  </Queries> 
</Subscription> 

备注

以下是一些重要说明:

  • 您必须定义由 BDC 模型中的订阅文件使用的筛选器,并且外部系统必须支持这些筛选器。

  • 此外,在手动更新现有 BDC 模型时,必须提高已修改的外部内容类型的版本以确保部署过程中不会忽略所做更改。