次の方法で共有


キャッシュを使用する場合の Business Connectivity Services ソリューションのパフォーマンスを向上する

最終更新日: 2010年6月30日

適用対象: SharePoint Server 2010

この記事の内容
外部データ ソースへの呼び出しを最小限にするためにバージョン フィールドを使用する
必要な場合にのみ関連付けを有効にする
関連データが必要な場合は 1 つではなく 2 つのサブスクリプションを使用する
サブスクリプション内の明示的な ID を使用して同期させるアイテムを指定する
クライアント アプリケーションでダウンロードされるデータの量を減らすためのフィルターを指定する

キャッシュを使用する Business Connectivity Services ソリューションを設計するときに、キャッシュを最適な方法で使用して、アプリケーションが最適なパフォーマンスを得られるようにするために、以下のベスト プラクティスに留意してください。

  • 外部アプリケーションの呼び出しを最小限にするために、使用できる場合はバージョン フィールドを使用します。

  • アプリケーションが必要とする関連付けのみを有効にし、エンド ユーザーが誤って関連付けを有効にしないようにします。

  • 関連データが必要な場合、サブスクリプション関連付けを持つ 1 つのサブスクリプションではなく、2 つのサブスクリプションを使用することを検討してください。

  • サブスクリプション内の明示的な ID を使用して同期させるアイテムを指定します。

  • クライアント アプリケーションでダウンロードされるデータの量を減らすためのフィルターを指定します。

上記のそれぞれのベスト プラクティスを詳しく確認してみましょう。

外部データ ソースへの呼び出しを最小限にするためにバージョン フィールドを使用する

外部データ ソースでバージョン フィールドを使用することによって外部データ ソースの呼び出しを最小限にすることができます。バージョン フィールドは、エンティティ インスタンスのバージョン、あるいはエンティティ インスタンスが外部データ ソースで最後に更新された時間である LastModified タイムスタンプを示す、増分する数値フィールドです。このようなフィールドが使用可能の場合、それはモデル内の Finder および SpecificFinder メソッドの戻り値パラメーターの一部である必要があります。バージョン フィールドが使用可能であれば、同期プロセスは外部アプリケーションから ID とバージョンの両方を取得し、バージョンがキャッシュされたものと異なる場合にのみ、SpecificFinder 呼び出しを行います。

必要な場合にのみ関連付けを有効にする

サブスクリプションが有効な関連付けを含む場合は、同期プロセスは関連するエンティティ インスタンスを含むキャッシュを設定します。このために、このサブスクリプションのためのキャッシュ内のエンティティ インスタンスと同じ数の Associate メソッド インスタンス呼び出しを行います。これにより、関連するエンティティ インスタンスの ID が返されます。次に、その他のフィールドを取得するために、返された ID のそれぞれについて SpecificFinder を呼び出します。これがキャッシュで多くのオーバーヘッドの原因となり、アプリケーションのパフォーマンスを大きく低下させることがあるため、必要とする場合にのみ関連付けを有効にする必要があります。

関連データが必要な場合は 1 つではなく 2 つのサブスクリプションを使用する

前述のように、関連付けは、キャッシュで多くのオーバーヘッドの原因となり、アプリケーションのパフォーマンスを大きく低下させることがあります。アプリケーションで関連データが必要な場合、2 つのサブスクリプションを作成することを検討してください。サブスクリプション関連付けを使用する代わりに、Customers のために 1 つ、Orders のために 1 つ作成します。これにより、外部アプリケーションへの呼び出しが減り、アプリケーションのスループットが向上します。

サブスクリプション内の明示的な ID を使用して同期させるアイテムを指定する

どのアイテムを同期させるべきか正確に知っている場合は、サブスクリプションに個別にその ID を追加することができます。サブスクリプション XML ファイルにシリアル番号の ID を付けるため、これはプログラミングにより行うのは簡単です。

シリアル番号の ID を取得するには、適切な識別子値を持つ Identity オブジェクトをインスタンス化し、その Serialize メソッドを呼び出します。詳細については、Identity.Serialize() のドキュメントを参照してください。

ID のシリアル化された文字列を得た後で、このトピックの後で示す例のように、<Identities> タグ内の <Identity> タグ内に、それを追加します (「」を参照)。

クライアント アプリケーションでダウンロードされるデータの量を減らすためのフィルターを指定する

同期を最適化する明白な方法は、クライアントでダウンロードされるデータの量を減らすことであり、これをするもっとも簡単な方法はフィルターを使用することです。ダウンロードされるアイテムの数を減らすために使用できる、同期フレームワークでサポートされているフィルターは Wildcard、Comparison、および Limit フィルターです。たとえば、Wildcard フィルターを使用し、フィルター値として "M*" を指定することにより、名前が文字 "M" から始まるすべての従業員をダウンロードすることができます。あるいは、Comparison フィルターを使用して、郵便番号が "98052" に等しいすべての顧客を選択することができます。Limit フィルターは、製品の数を 100 に制限するために使用することができます。

以下は、明示的な ID が 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 モデルを更新するとき、変更が展開中に無視されないように、変更された外部コンテンツ タイプのバージョンを増やす必要があります。