リソース アイテムの子アイテムをスレッドセーフに取得できない


説明

Sitecore XPバージョン10.2では、アプリケーションのパフォーマンスの最適化を目的としたコード変更が実施されました。しかし、これらの変更により、Sitecoreのキャッシュを破壊するおそれのある、競合状態が引き起こされる可能性があることが判明しました。この問題は、リソース アイテムの子アイテムに同時にアクセスする際に発生します。 子アイテム数が多い場合、この問題が発生しやすくなります。この問題が発生した場合、以下のメッセージがログに出力されます:

ERROR [Sitecore.Web.HttpModule] Application error.
Exception: System.IndexOutOfRangeException
Message: Index was outside the bounds of the array.
Source: mscorlib
   at System.Collections.Generic.List`1.Add(T item)
   at Sitecore.Data.DataProviders.PrefetchData.AddChildId(ID childId)
   at Sitecore.Data.DataProviders.PrefetchData.AddChildrenForEmptyDefinition(IDList list)
   at Sitecore.Data.DataProviders.Sql.SqlDataProvider.GetChildIDs(ItemDefinition itemDefinition, CallContext context)
   at Sitecore.Data.DataProviders.CompositeDataProvider.<DoGetChildIDs>d__94.MoveNext()
   at Sitecore.Common.EnumerableExtensions.ForEach[T](IEnumerable`1 sequence, Action`1 action)
   at Sitecore.Data.DataProviders.CompositeDataProvider.GetChildIDs(ItemDefinition itemDefinition, CallContext context)
   at Sitecore.Data.DataProviders.DataProvider.GetChildIDs(ItemDefinition item, CallContext context, DataProviderCollection providers)
   at Sitecore.Data.DataSource.GetChildIDs(ID itemID)
   at Sitecore.Nexus.Data.DataCommands.GetChildrenCommand.Execute(Item item)
   ...

または、以下のエラー メッセージが出力される可能性もあります。

ERROR Application error.
Exception: System.ArgumentNullException
Message: Value cannot be null.
Parameter name: key
Source: mscorlib
   at System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(TKey key, TValue& value)
   at Sitecore.Caching.Generics.Cache`1.InnerBox.DoGetEntry(TKey key, Boolean updateAccessed)
   at Sitecore.Caching.Generics.Cache`1.GetValue(TKey key)
   at Sitecore.Caching.Generics.Cache`1.ContainsKey(TKey key)
   at Sitecore.Data.DataProviders.Sql.SqlDataProvider.EnsureChildrenPrefetched(ID parentId, IDList childIds)
   at Sitecore.Data.DataProviders.Sql.SqlDataProvider.GetChildIDs(ItemDefinition itemDefinition, CallContext context)
   at Sitecore.Data.DataProviders.CompositeDataProvider.<DoGetChildIDs>d__94.MoveNext()
   at Sitecore.Common.EnumerableExtensions.ForEach[T](IEnumerable`1 sequence, Action`1 action)
   at Sitecore.Data.DataProviders.CompositeDataProvider.GetChildIDs(ItemDefinition itemDefinition, CallContext context)
   at Sitecore.Data.DataProviders.DataProvider.GetChildIDs(ItemDefinition item, CallContext context, DataProviderCollection providers)
   at Sitecore.Data.DataSource.GetChildIDs(ID itemID)
   at Sitecore.Nexus.Data.DataCommands.GetChildrenCommand.Execute(Item item)
   ...

解決策

この問題を解決するには、以下の解決策のいずれかの実施を検討してください。