1

Sitecore のリンク プロバイダーをオーバーライドした後、CPU が急上昇します。特定のタイプのテンプレートのエイリアス URL を取得するために GetItemUrl をオーバーライドしています。ウェブサイトにアクセスするのがキープアライブ ページだけの場合、CPU の 80% まで使用されます。

これは正常に動作するデフォルトのリンク プロバイダーの構成行です。

<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="never" languageLocation="filePath" shortenUrls="true" useDisplayName="false" />

これは、CPU をスパイクするカスタム リンク プロバイダーの構成行です。

<add name="sitecore"
type="Library.Pipelines.CustomLinkProvider, Library"
addAspxExtension="false"
alwaysIncludeServerUrl="false"
encodeNames="true"
languageEmbedding="never"
languageLocation="filePath"
shortenUrls="true"
useDisplayName="false" />

CustomLinkProvider クラス:

public class CustomLinkProvider : LinkProvider
{
    public override string GetItemUrl(Item item, UrlOptions options)
    {
        // check if item is factsheet or story, if it is then get the alias url
        if (item.TemplateID == ItemConstants.Pages.Factsheet.TemplateID 
        || item.TemplateID == ItemConstants.Pages.Story.TemplateID)
        {
            if (Sitecore.Context.Database != null)
            {
                if (SitecoreHelpers.HasAlias(item, Sitecore.Context.Database))
                {
                    Item alias = SitecoreHelpers.GetAlias(item, Sitecore.Context.Database);
                    string friendlyUrl = alias.Name;
                    return friendlyUrl;
                }
            }
        }
        return base.GetItemUrl(item, options);
    }
}

これは GetAlias 関数です。

public static Item GetAlias(Item currentItem, Database database)
{
    Item aliasFolder = database.GetItem(ItemConstants.Common.SystemAliasFolder);

    Item alias =
        aliasFolder.Children.FirstOrDefault(
        x => ((LinkField) x.Fields["Linked item"]).TargetID == currentItem.ID);

    return alias;
}

なぜこれがCPUを急上昇させるのか、誰にも分かりますか? 現在、約 600 のエイリアスがありますが、これほど大きなスパイクが発生するとは思いません。

4

1 に答える 1

6

問題を引き起こしているのは HasAlias と GetAlias の組み合わせだと思います。600 個のサイトコア アイテムを反復処理すると、実際に CPU スパイクが発生する可能性があり、特にリンク プロバイダーへの複数の呼び出しが発生する可能性があります。ANTS などのプロファイラーで確認できます。

すべての呼び出しでこれを行う代わりに、すべてのエイリアスを読み取り、アイテムをエイリアスに関連付けるデータ構造をキャッシュすることをお勧めします。エイリアスが追加、編集、または削除されたときにキャッシュをクリアする必要がありますが、これにより CPU サイクルを大幅に節約できます。

于 2013-02-20T23:58:45.347 に答える