AzureがMongoDBの接続を切断する


概要

Sitecore XP 7.5以降のバージョンでは、アナリティクス データの取得と処理にMongoDBデータベースを使用しています。これらのSitecore XPバージョンは、Azureでホストすることができます。Azureはアイドル状態のMongoDBの接続を切断する場合があり、そのためアナリティクスが失敗し、ログ ファイルで以下のようなエラーが発生することがあります。

ERROR MongoDbDictionary.Store() has failed.
Exception: Sitecore.Analytics.DataAccess.DatabaseNotAvailableException
Message: Database not available
Source: Sitecore.Analytics.MongoDB
   at Sitecore.Analytics.Data.DataAccess.MongoDb.MongoDbCollection.Execute(Action action, ExceptionBehavior exceptionBehavior)
   at Sitecore.Analytics.Data.DataAccess.MongoDb.MongoDbCollection.Save[TNominalType](TNominalType value)
   at Sitecore.Analytics.Data.DataAccess.MongoDb.MongoDbDictionary.Store(Object value)
ERROR Exception when executing agent aggregation/automationRangeManager
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: Sitecore.Analytics.MongoDB
   at Sitecore.Analytics.RangeScheduler.MongoDbRangeMap2.GetRightKey()    at Sitecore.Analytics.Automation.Aggregation.Data.Processing.RangeManagerAgent.Execute()    at Sitecore.Analytics.Core.BackgroundService.Run()

解決策

この問題を解決するには、全てのMongoDBの接続文字列でmaxIdleTimeMSパラメータを60000に設定します。MongoDBの接続文字列のフォーマットや、サポートされるパラメータの詳細に関しては、MongoDBドキュメント サイトをご参照ください。

<add name="analytics" connectionString="mongodb://user:password@host/analytics?replicaSet=rs1;ssl=true;maxIdleTimeMS=60000" />
<add name="tracking.live" connectionString="mongodb://user:password@host/tracking_live?replicaSet=rs1;ssl=true;maxIdleTimeMS=60000" />
<add name="tracking.history" connectionString="mongodb://user:password@host/tracking_history?replicaSet=rs1;ssl=true;maxIdleTimeMS=60000" />
<add name="tracking.contact" connectionString="mongodb://user:password@host/tracking_contact?replicaSet=rs1;ssl=true;maxIdleTimeMS=60000" />

これにより、Sitecore XPはAzureが接続を切断しようとする前に、アイドル状態のMongoDBの接続をリサイクルし、必要に応じて新しい接続を確立します。

接続文字列内のパラメータは、次の区切り記号で区切ることができます。

ある区切り記号が動作しない(設定エラーになる)場合、別の区切り記号をお試しください。