Propertiesテーブルの変更がEvent Disablerを遵守しない


説明

異なるインスタンスの間でデータを共有するために、Sitecoreは、データベースのPropertiesテーブルを使用する場合があります。Sitecoreが通常このテーブルに保存するデータの例としては、前回のパブリッシュを実施した時刻、前回のEventQueueエントリのタイムスタンプ、インデックスの更新に関連するデータなどです。

Sitecoreには、Propertiesテーブルの周りにキャッシュ層があり、そこから読み取った値をキャッシュして再利用できるようになっています。キャッシュを実施するには、テーブルの変更を異なるSitecoreインスタンス間で同期する必要があります。これは、EventQueueのメカニズムを使用して、次のような方法で実現されています:

特定のPropertiesテーブルにアクセスするために使用されるSitecore.Data.Database.Propertiesコレクションが変更されると、PropertyChangedRemoteEventイベントがEventQueueテーブルに記録され、このイベントを受信した他のSitecoreインスタンスは、キャッシュされた値を変更できます。

状況によっては、このような同期のロジックは過剰とみなされ、サーバーのリソースが必要以上に占有してしまいます。例えば、Propertiesテーブルに格納されたカスタムのデータが、単一のSitecoreインスタンスでのみ使用されるような場合に、これが発生する可能性があります。このような場合、すべてのSitecoreインスタンス間でキャッシュを同期させる必要はありません。

そのような場合に上述のイベントを無効にするには、EventQueueテーブルへデータを入力しないようにし、キャッシュの同期を無効にします。EventDisablerオブジェクトの使用が推奨されます。

using (new Sitecore.Data.Events.EventDisabler())
{
    database.Properties["key"] = "value";
}

しかし、EventDisablerを使用したにも関わらず、Sitecoreが上記のイベントを生成し、EventQueueテーブルにレコードを入力してしまう問題が発生します。

解決策

Sitecore.Data.Database.Propertiesコレクションを取り扱う際に、Sitecore CMSがEventDisablerの状態を遵守させるには、以下の手順を実施してください:

  1. 添付のSitecore.Support.420602.dll アセンブリをソリューションの\binフォルダに配置します。
  2. 添付のSitecore.Support.420602.configアセンブリをソリューションの\App_Config\Includeフォルダに配置します。

※:上記の解決策は、SQLサーバーのデータベースにのみ該当します。